Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
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
20 changes: 20 additions & 0 deletions src/main/java/coordinate/MainApplication.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package coordinate;

import coordinate.figure.Figure;
import coordinate.figure.FigureFactory;
import coordinate.figure.FigureSize;
import coordinate.graph.Graph;
import coordinate.io.ConsoleInputHandler;
import coordinate.io.ConsoleOutputHandler;

public class MainApplication {
private static final ConsoleInputHandler inputHandler = new ConsoleInputHandler();
private static final ConsoleOutputHandler outputHandler = new ConsoleOutputHandler();

public static void main(String[] args) {
FigureSize figureSize = inputHandler.getFigureSize();
Figure figure = FigureFactory.create(figureSize);
Graph graph = Graph.from(figure);
outputHandler.printGraph(graph);
}
}
8 changes: 8 additions & 0 deletions src/main/java/coordinate/exception/CoordinateException.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package coordinate.exception;

public class CoordinateException extends RuntimeException {

public CoordinateException(String message) {
super(message);
}
}
8 changes: 8 additions & 0 deletions src/main/java/coordinate/figure/Figure.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package coordinate.figure;

public interface Figure {

double calculate();

boolean isMark(int x, int y);
}
8 changes: 8 additions & 0 deletions src/main/java/coordinate/figure/FigureFactory.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package coordinate.figure;

public class FigureFactory {

public static Figure create(FigureSize figureSize) {
return FigureType.get(figureSize);
}
}
33 changes: 33 additions & 0 deletions src/main/java/coordinate/figure/FigureSize.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package coordinate.figure;

import coordinate.point.Coordinate;
import coordinate.point.Points;
import coordinate.utils.StringUtils;
import java.util.List;
import java.util.stream.Collectors;

public class FigureSize {

private final List<Coordinate> figureSizes;

private FigureSize(List<Coordinate> figureSizes) {
this.figureSizes = figureSizes;
}

public static FigureSize from(String userInputFigureSize) {
List<String> splitedByHyphen = StringUtils.splitByHyphen(userInputFigureSize);

List<Coordinate> figureSizes = splitedByHyphen.stream()
.map(Coordinate::from)
.collect(Collectors.toList());

return new FigureSize(figureSizes);
}

public Points toPoints() {
return Points.from(figureSizes.stream()
.map(Coordinate::toPoint)
.collect(Collectors.toList()));
}

}
39 changes: 39 additions & 0 deletions src/main/java/coordinate/figure/FigureType.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package coordinate.figure;

import coordinate.exception.CoordinateException;
import coordinate.messages.ErrorMessage;
import coordinate.point.Points;
import java.util.Arrays;

public enum FigureType {
LINE(2) {
@Override
public Figure createFigure(Points points) {
return Line.from(points);
}
},
RECTANGLE(4) {
@Override
public Figure createFigure(Points points) {
return Rectangle.from(points);
}
};

private final int pointsSize;

FigureType(int pointsSize) {
this.pointsSize = pointsSize;
}

public abstract Figure createFigure(Points points);

public static Figure get(FigureSize figureSize) {
Points points = figureSize.toPoints();

return Arrays.stream(values())
.filter(type -> type.pointsSize == points.size())
.findFirst()
.orElseThrow(() -> new CoordinateException(ErrorMessage.invalidFigureSize))
.createFigure(points);
}
}
59 changes: 59 additions & 0 deletions src/main/java/coordinate/figure/Line.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package coordinate.figure;

import coordinate.point.Point;
import coordinate.point.Points;
import java.util.List;

public class Line implements Figure {

private final Points points;

private Line(Points points) {
this.points = points;
}

public static Line from(Points points) {
return new Line(points);
}

@Override
public String toString() {
return String.format("두 점 사이의 거리는: " + calculate());
}

@Override
public boolean isMark(int x, int y) {
return points.isMarkedAt(x, y);
}

/**
* 제곱근((A.x - B.x)^제곱 + (A.y - B.y)^제곱)
*/
@Override
public double calculate() {
List<Point> points = this.points.getPoints();

Point firstPoint = getFirstPoint(points);
Point secondPoint = getSecondPoint(points);

return calculateDistanceBetweenPoints(firstPoint, secondPoint);
}

private Point getFirstPoint(List<Point> points) {
return points.get(0);
}

private Point getSecondPoint(List<Point> points) {
return points.get(1);
}

private double calculateDistanceBetweenPoints(Point point1, Point point2) {
double subX = square(point1.subtractionByX(point2));
double subY = square(point1.subtractionByY(point2));
return Math.sqrt(subX + subY);
}

private double square(int value) {
return Math.pow(value, 2);
}
}
58 changes: 58 additions & 0 deletions src/main/java/coordinate/figure/Rectangle.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package coordinate.figure;

import coordinate.point.Point;
import coordinate.point.Points;
import java.util.List;

public class Rectangle implements Figure {

Points points;

private Rectangle(Points points) {
this.points = points;
}

public static Rectangle from(Points points) {
return new Rectangle(points);
}

@Override
public boolean isMark(int x, int y) {
return points.isMarkedAt(x, y);
}

@Override
public String toString() {
return "사각형의 넓이는 " + (int) calculate();
}

/**
* width * height
*/
@Override
public double calculate() {
List<Point> points = this.points.getPoints();

Point leftBottomPoint = getLeftBottomPoint(points);
Point rightTopPoint = getRightTopPoint(points);

return getWidth(leftBottomPoint, rightTopPoint) * getHeight(leftBottomPoint, rightTopPoint);
}

private Point getLeftBottomPoint(List<Point> points) {
return points.get(0);
}

private static Point getRightTopPoint(List<Point> points) {
return points.get(2);
}

private double getWidth(Point point1, Point point2) {
return Math.abs(point1.subtractionByX(point2));
}

private double getHeight(Point point1, Point point2) {
return Math.abs(point1.subtractionByY(point2));
}

}
94 changes: 94 additions & 0 deletions src/main/java/coordinate/graph/Graph.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
package coordinate.graph;

import coordinate.figure.Figure;
import java.util.stream.IntStream;

public class Graph {

public static final int MAX_VALUE = 24;
public static final int MIN_VALUE = 0;
public static final int MAX_INT_RANGE = 25;
public static final String PLUS_MARK = "+";
private static final String PIPE = "|";
private static final String DOUBLE_HYPHEN = "--";
private static final String NEW_LINE = System.lineSeparator();
public static final String POINT_MARK = "•";
public static final String SPACE = " ";

private final StringBuilder graphBuilder = new StringBuilder();
private final Figure figure;

private Graph(Figure figure) {
this.figure = figure;
}

public static Graph from(Figure figure) {
return new Graph(figure);
}

public StringBuilder draw() {
verticalDrawAndPoint();
horizontalDraw();
distanceBetweenPointsResult();
return graphBuilder;
}

private void distanceBetweenPointsResult() {
graphBuilder.append(NEW_LINE);
graphBuilder.append(figure.toString());
}

private void verticalDrawAndPoint() {
for (int y = MAX_VALUE; y > MIN_VALUE; y--) {
verticalDrawNumberWithPipe(y);
drawPoint(y);
graphBuilder.append(NEW_LINE);
}
}

private void verticalDrawNumberWithPipe(int y) {
if (isEvenNumber(y)) {
graphBuilder.append(String.format("%3d|", y));
return;
}

graphBuilder.append(String.format("%4s", PIPE));
}

private void drawPoint(int y) {
for (int x = 0; x < MAX_INT_RANGE; x++) {
markAdd(x, y, figure);
}
}

private void markAdd(int x, int y, Figure figure) {
if (figure.isMark(x, y)) {
graphBuilder.append(POINT_MARK);
return;
}

graphBuilder.append(String.format("%2s", SPACE));
}

private void horizontalDraw() {
horizontalLineDraw();
horizontalNumberDraw();
}

private void horizontalNumberDraw() {
IntStream.range(MIN_VALUE, MAX_INT_RANGE)
.filter(this::isEvenNumber)
.forEach(x -> graphBuilder.append(String.format("%4d", x)));
graphBuilder.append(NEW_LINE);
}

private void horizontalLineDraw() {
graphBuilder.append(String.format("%4s", PLUS_MARK));
IntStream.range(MIN_VALUE, MAX_VALUE).forEach(i -> graphBuilder.append(DOUBLE_HYPHEN));
graphBuilder.append(NEW_LINE);
}

private boolean isEvenNumber(int value) {
return value % 2 == MIN_VALUE;
}
}
26 changes: 26 additions & 0 deletions src/main/java/coordinate/io/ConsoleInputHandler.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package coordinate.io;

import coordinate.exception.CoordinateException;
import coordinate.figure.FigureSize;
import coordinate.messages.SystemMessage;
import java.util.Scanner;

public class ConsoleInputHandler {

private final Scanner scanner = new Scanner(System.in);

public FigureSize getFigureSize() {
try {
return FigureSize.from(inputFromUser());
} catch (CoordinateException e) {
System.out.println(e.getMessage());
return getFigureSize();
}
}

private String inputFromUser() {
System.out.println(SystemMessage.inputFigureSize);
return scanner.nextLine();
}

}
10 changes: 10 additions & 0 deletions src/main/java/coordinate/io/ConsoleOutputHandler.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package coordinate.io;

import coordinate.graph.Graph;

public class ConsoleOutputHandler {

public void printGraph(Graph graph) {
System.out.println(graph.draw().toString());
}
}
10 changes: 10 additions & 0 deletions src/main/java/coordinate/messages/ErrorMessage.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package coordinate.messages;

public class ErrorMessage {

public static final String invalidPoint = "좌표는 최소 0부터 최대 24까지 입력 할 수 있습니다.";
public static final String hyphenMustHave = "두 점의 좌표를 구분을 위해 '-' 필수로 입력 해야 합니다.";
public static final String regexNotMatched = "좌표는 '(x, y) 형식으로 입력하며 숫자만 입력 해야 합니다.";
public static final String invalidFigureSize = "해당 좌표로 도형을 생성 할 수 없습니다.";

}
6 changes: 6 additions & 0 deletions src/main/java/coordinate/messages/SystemMessage.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package coordinate.messages;

public class SystemMessage {

public static final String inputFigureSize = "좌표를 입력하세요.";
}
Loading