Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 22 additions & 9 deletions src/main/java/MainCoordinate.java
Original file line number Diff line number Diff line change
@@ -1,13 +1,10 @@
import domain.Line;
import domain.*;
import util.Parser;
import domain.Point;
import domain.MakingPoints;

import java.util.List;

import static view.InputView.getCoordinateValue;
import static view.ResultView.printCoordinate;
import static view.ResultView.printLineLength;
import static view.ResultView.*;

public class MainCoordinate {
public static void main(String[] args) {
Expand All @@ -16,12 +13,28 @@ public static void main(String[] args) {

private static void start() {
try {
List<Point> pointList = MakingPoints.makePoints(Parser.makePosition(getCoordinateValue()));
printCoordinate(pointList);
printLineLength(new Line().getLength(pointList));
} catch (Exception e) {
List<Point> points = PointsFactory.makePoints(Parser.makePosition(getCoordinateValue()));
printCoordinate(points);
decideFigure(points);

} catch (IllegalArgumentException e) {
System.out.println("좌표값을 잘못 입력했습니다. 다시 입력하세요.");
start();
}
}

private static void decideFigure(List<Point> points) {
if (points.size() == 4) {
Rectangle rectangle = new Rectangle(points);
printRectangleArea(rectangle.calculateArea());
}
if (points.size() == 3) {
Triangle triangle = new Triangle(points);
printTriangleArea(triangle.calculateArea());
}
if (points.size() == 2) {
Line line = new Line(points);
printLineLength(line.calculateLength());
}
}
}
18 changes: 15 additions & 3 deletions src/main/java/domain/Line.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,22 @@
import java.util.List;

public class Line {
static final int FIRST_POINT = 0;
static final int SECOND_POINT = 1;
private static final int FIRST_POINT = 0;
private static final int SECOND_POINT = 1;
private List<Point> points;

public double getLength(List<Point> points) {
public Line(List<Point> points) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

points.size()가 2인지 체크해야 하지 않을까?

checkSize(points);
this.points = points;
}

private void checkSize(List<Point> points) {
if (points.size() != 2) {
throw new IllegalArgumentException();
}
}

public double calculateLength() {
return points.get(FIRST_POINT).calculateLength(points.get(SECOND_POINT));
}
}
17 changes: 0 additions & 17 deletions src/main/java/domain/MakingPoints.java

This file was deleted.

16 changes: 8 additions & 8 deletions src/main/java/domain/Point.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package domain;

public class Point {
static final int LINE_SIZE = 51;
static final int MAX_POINT_VALUE = 24;
static final int UNIT_DIGIT_RANGE = 10;
static final int TWO = 2;
static final int ONE = 1;
private static final int LINE_SIZE = 51;
private static final int MAX_POINT_VALUE = 24;
private static final int UNIT_DIGIT_RANGE = 10;
private static final int TWO = 2;
private static final int ONE = 1;

private int xPos;
private int yPos;
Expand All @@ -17,11 +17,11 @@ public Point(int xPos, int yPos) {
this.yPos = yPos;
}

public int subtractXPoint(Point p) {
int subtractXPoint(Point p) {
return xPos - p.xPos;
}

public int subtractYPoint(Point p) {
int subtractYPoint(Point p) {
return yPos - p.yPos;
}

Expand All @@ -31,7 +31,7 @@ public int findPointPosition() {
return index;
}

public double calculateLength(Point p) {
double calculateLength(Point p) {
return Math.sqrt(Math.pow(this.subtractXPoint(p), 2) + Math.pow(this.subtractYPoint(p), 2));
}
}
17 changes: 17 additions & 0 deletions src/main/java/domain/PointsFactory.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package domain;

import java.util.ArrayList;
import java.util.List;

public class PointsFactory {
private static final int X_POSITION = 0;
private static final int Y_POSITION = 1;

public static List<Point> makePoints(List<Integer[]> positions) {
List<Point> pointList = new ArrayList<>();
for (Integer[] position : positions) {
pointList.add(new Point(position[X_POSITION], position[Y_POSITION]));
}
return pointList;
}
}
64 changes: 64 additions & 0 deletions src/main/java/domain/Rectangle.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package domain;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Rectangle {
private static final int ZERO = 0;
private static final int ONE = 1;
private static final int FOUR = 4;

private List<Point> points;

public Rectangle(List<Point> points) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

points.size()가 4인지 체크해야 하지 않을까?

check(points);
this.points = points;
}

private void check(List<Point> points) {
checkSize(points);
int check = 0;
for (Point point : points) {
check += cntCoordinateValue(0, 0, point, points);
}
checkRectangle(check);
}

private void checkSize(List<Point> points) {
if (points.size() != 4) {
throw new IllegalArgumentException();
}
}

private int cntCoordinateValue(int xCnt, int yCnt, Point point, List<Point> points) {
for (Point other : points) {
if (point.subtractXPoint(other) == ZERO) {
xCnt++;
}
if (point.subtractYPoint(other) == ZERO) {
yCnt++;
}
}
if (xCnt == 2 && yCnt == 2) {
return ONE;
}
return ZERO;
}

private void checkRectangle(int check) {
if (check == FOUR) {
return;
}
throw new IllegalArgumentException("사각형이 아닙니다");
}

public int calculateArea() {
List<Double> length = new ArrayList<>();
for (int i = 0; i < points.size() - 1; i++) {
length.add(points.get(i).calculateLength(points.get(i + 1)));
}
Collections.sort(length);
return (int) (length.get(ZERO) * length.get(ONE));
}
}
50 changes: 50 additions & 0 deletions src/main/java/domain/Triangle.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package domain;

import java.util.ArrayList;
import java.util.List;

public class Triangle {
private static final int ZERO = 0;
private static final int ONE = 1;
private static final int TWO = 2;

private List<Point> points;

public Triangle(List<Point> points) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

points.size()가 3인지 체크해야 하지 않을까?

checkSize(points);
this.points = points;
}

private void checkSize(List<Point> points) {
if (points.size() != 3) {
throw new IllegalArgumentException();
}
}

//삼각형 길이 구하기
private List<Double> calculateTriangleLength() {
List<Double> lengths = new ArrayList<>();
lengths.add(points.get(ZERO).calculateLength(points.get(ONE)));
lengths.add(points.get(ONE).calculateLength(points.get(TWO)));
lengths.add(points.get(ZERO).calculateLength(points.get(TWO)));
return lengths;
}

//헤론 공식
private double findS(List<Double> lengths) {
double sum = 0;
for (int i = 0; i < points.size() - 1; i++) {
lengths.add(points.get(i).calculateLength(points.get(i + 1)));
sum += lengths.get(i);
}
lengths.add(points.get(ZERO).calculateLength(points.get(TWO)));
sum += lengths.get(TWO);
return (sum / 2);
}

public double calculateArea() {
List<Double> lengths = calculateTriangleLength();
double s = findS(lengths);
return Math.sqrt(s * (s - lengths.get(ZERO)) * (s - lengths.get(ONE)) * (s - lengths.get(TWO)));
}
}
33 changes: 18 additions & 15 deletions src/main/java/view/CoordinateView.java
Original file line number Diff line number Diff line change
@@ -1,29 +1,32 @@
package view;

public class CoordinateView {
static final String VERTICAL_LINE = "│";
static final String HORIZONTAL_LINE = "──";
static final String CROSS = "+";
static final String BLANK = " ";
static final String ZERO = "0";
static final int LENGTH = 24;
private StringBuilder sb = new StringBuilder();

private void drawRow() {
private static final String VERTICAL_LINE = "│";
private static final String HORIZONTAL_LINE = "──";
private static final String CROSS = "+";
private static final String BLANK = " ";
private static final String ZERO = "0";
private static final int LENGTH = 24;
private static StringBuilder sb = new StringBuilder();

private CoordinateView() {
}

private static void drawRow() {
for (int i = LENGTH; i > 0; i--) {
drawRowValue(i);
}
}

private void drawRowValue(int index) {
private static void drawRowValue(int index) {
if (index % 2 != 0) {
sb.append(String.format("%2s", BLANK) + VERTICAL_LINE + String.format("%47s", BLANK) + '\n');
return;
}
sb.append(String.format("%2s", index) + VERTICAL_LINE + String.format("%47s", BLANK) + '\n');
}

private void drawXLine() {
private static void drawXLine() {
sb.append(String.format("%3s", CROSS));
for (int i = 0; i < LENGTH; i++) {
sb.append(HORIZONTAL_LINE);
Expand All @@ -32,7 +35,7 @@ private void drawXLine() {
drawXLineNum();
}

private void drawXLineNum() {
private static void drawXLineNum() {
sb.append(String.format("%2s", ZERO) + BLANK);
for (int i = 1; i <= LENGTH; i++) {
if (i % 2 == 1) {
Expand All @@ -44,16 +47,16 @@ private void drawXLineNum() {
}
}

public void drawDot(int position) {
static void drawDot(int position) {
sb.setCharAt(position, '●');
}

public void makeCoordinate() {
static void makeCoordinate() {
drawRow();
drawXLine();
}

public StringBuilder getCoordinateSb() {
static StringBuilder getCoordinateSb() {
return sb;
}
}
2 changes: 1 addition & 1 deletion src/main/java/view/InputView.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import java.util.Scanner;

public class InputView {
static Scanner sc = new Scanner(System.in);
private static Scanner sc = new Scanner(System.in);

public static String getCoordinateValue() {
System.out.println("좌표를 입력하세요");
Expand Down
14 changes: 10 additions & 4 deletions src/main/java/view/ResultView.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,11 @@

public class ResultView {
public static void printCoordinate(List<Point> pl) {
CoordinateView cv = new CoordinateView();
cv.makeCoordinate();
CoordinateView.makeCoordinate();
for (Point point : pl) {
cv.drawDot(point.findPointPosition());
CoordinateView.drawDot(point.findPointPosition());
}
System.out.println(cv.getCoordinateSb());
System.out.println(CoordinateView.getCoordinateSb());
// for (int i = 0; i < pl.size(); i++) {
// cv.drawDot(pl.get(i).findPointPosition());
// }
Expand All @@ -23,4 +22,11 @@ public static void printLineLength(double len) {
System.out.println("두 점 사이 거리는 " + String.format("%.6f", len));
}

public static void printRectangleArea(int area) {
System.out.println("사각형의 넓이는 " + area);
}

public static void printTriangleArea(double area) {
System.out.println("삼각형의 넓이는 " + String.format("%.1f", area));
}
}
4 changes: 2 additions & 2 deletions src/test/java/domain/LineTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public void calcLengthTest() {
List<Point> pl = new ArrayList<>();
pl.add(p1);
pl.add(p2);
Line line = new Line();
assertThat( line.getLength(pl)).isEqualTo(5.0000);
Line line = new Line(pl);
assertThat( line.calculateLength()).isEqualTo(5.0000);
}
}
Loading