diff --git a/src/main/java/serializer/DrawerWithSave.java b/src/main/java/serializer/DrawerWithSave.java index 2852edf47f756a132226ce5463599bdf1b95601c..e3b746fd415672722e43a9b679e9588d9e837fd8 100644 --- a/src/main/java/serializer/DrawerWithSave.java +++ b/src/main/java/serializer/DrawerWithSave.java @@ -1,14 +1,10 @@ package serializer; -import javafx.scene.canvas.Canvas; import javafx.scene.control.Alert; import javafx.stage.FileChooser; -import shape.Shape; import java.io.File; import java.io.IOException; -import java.util.List; -import java.util.stream.Collectors; public class DrawerWithSave extends state.Drawer { diff --git a/src/main/java/serializer/ShapeReader.java b/src/main/java/serializer/ShapeReader.java index 4905948e502223776ff4e2f8367b633669915e01..54540cca74b29246f5f44d2344925d4792a3e4a0 100644 --- a/src/main/java/serializer/ShapeReader.java +++ b/src/main/java/serializer/ShapeReader.java @@ -7,7 +7,6 @@ import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.List; -import java.util.stream.Collector; public class ShapeReader { public static List<Shape> read(File file) throws IOException { diff --git a/src/main/java/shape/AbstractShape.java b/src/main/java/shape/AbstractShape.java new file mode 100644 index 0000000000000000000000000000000000000000..db97daddd5da35efae50a2178be048ab9c716e3f --- /dev/null +++ b/src/main/java/shape/AbstractShape.java @@ -0,0 +1,33 @@ +package shape; + +import javafx.geometry.Point2D; +import javafx.scene.canvas.GraphicsContext; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public abstract class AbstractShape implements Shape { + + protected List<Point2D> points = new ArrayList<>(); + + public void addPoints(Point2D... points){ + this.points.addAll(Arrays.asList(points)); + } + @Override + public int pointsCount() { + return points.size(); + } + + @Override + public Point2D point(int index) { + if( index >= 0 && index < points.size()){ + return points.get(index); + }else { + throw new IndexOutOfBoundsException("Index out of bounds"); + } + } + + @Override + public abstract void draw(GraphicsContext context) ; +} diff --git a/src/main/java/shape/App.java b/src/main/java/shape/App.java index 1a519e1401fe032f06aeee35967a27e48ca362fe..0ba88a56c91b19fc643b0488c92db27a9362a639 100644 --- a/src/main/java/shape/App.java +++ b/src/main/java/shape/App.java @@ -7,7 +7,6 @@ import javafx.scene.Scene; import javafx.scene.canvas.Canvas; import javafx.scene.canvas.GraphicsContext; import javafx.scene.paint.Color; -import javafx.scene.paint.Paint; import javafx.stage.Stage; @@ -21,12 +20,20 @@ public class App extends Application { @Override public void start(Stage primaryStage) { Group root = new Group(); - Canvas canvas = new Canvas(130, 110); + Canvas canvas = new Canvas(300, 300); GraphicsContext graphicsContext = canvas.getGraphicsContext2D(); ShapeContainer shapeContainer = new ShapeContainer(); - graphicsContext.setFill(Color.AQUAMARINE); - graphicsContext.fillOval(10,10,10,10); - shapeContainer.addShape(new Rectangle(Color.BLUE,new Point2D(10,10), new Point2D(40,40))); + + Shape rectangle = new Rectangle(Color.BLUE, new Point2D(50, 50), new Point2D(150, 100)); + rectangle = new BorderDecorator(rectangle, 10); + rectangle = new CenterDecorator(rectangle, 5); + shapeContainer.addShape(rectangle); + + Shape polygone = new Polygon(Color.YELLOW, new Point2D(210,100),new Point2D(250,100),new Point2D(150,160), new Point2D(90,100)); + polygone = new BorderDecorator(polygone, 15); + polygone = new CenterDecorator(polygone, 5); + shapeContainer.addShape(polygone); + shapeContainer.draw(graphicsContext); root.getChildren().add(canvas); primaryStage.setScene(new Scene(root)); diff --git a/src/main/java/shape/BorderDecorator.java b/src/main/java/shape/BorderDecorator.java new file mode 100644 index 0000000000000000000000000000000000000000..bb0865612f230286f105742efda3e9c2a4fe51b0 --- /dev/null +++ b/src/main/java/shape/BorderDecorator.java @@ -0,0 +1,30 @@ +package shape; + +import javafx.geometry.Point2D; +import javafx.scene.canvas.GraphicsContext; +import javafx.scene.paint.Color; + +public class BorderDecorator extends Decorator { + + private final double radius; + + public BorderDecorator(Shape decoratedShape ,double radius) { + super(decoratedShape); + this.radius = radius; + } + protected void drawDecoration(GraphicsContext context) { + context.setStroke(Color.BLACK); + context.setLineWidth(2); + + if (decoratedshape.pointsCount() >= 2){ + Point2D point0 = decoratedshape.point(0); + Point2D point1 = decoratedshape.point(1); + + double x = Math.min(point0.getX(), point1.getX()); + double y = Math.min(point0.getY(), point1.getY()); + double width = Math.abs(point1.getX() - point0.getX()); + double height = Math.abs(point1.getY() - point0.getY()); + context.strokeRoundRect(x,y, width,height,radius, radius); + } + } +} diff --git a/src/main/java/shape/CenterDecorator.java b/src/main/java/shape/CenterDecorator.java new file mode 100644 index 0000000000000000000000000000000000000000..8a7c68a07a6b52549afdd6e8ba75520136c3c5d6 --- /dev/null +++ b/src/main/java/shape/CenterDecorator.java @@ -0,0 +1,26 @@ +package shape; + +import javafx.geometry.Point2D; +import javafx.scene.canvas.GraphicsContext; +import javafx.scene.paint.Color; + +public class CenterDecorator extends Decorator{ + private final double radius; + public CenterDecorator(Shape decoratedShape, double radius) { + super(decoratedShape); + this.radius = radius; + } + protected void drawDecoration(GraphicsContext context) { + + if (decoratedshape.pointsCount() >= 2) { + Point2D point0 = decoratedshape.point(0); + Point2D point1 = decoratedshape.point(1); + + double centerX = point0.getX() + point1.getX() / 2; + double centerY = point0.getY() + point1.getY() / 2; + + context.setFill(Color.RED); + context.strokeOval(centerX - radius, centerY - radius, radius * 2, radius * 2); + } + } +} diff --git a/src/main/java/shape/Decorator.java b/src/main/java/shape/Decorator.java new file mode 100644 index 0000000000000000000000000000000000000000..08bed2e38c7ac74ec230676535c0101f24189c61 --- /dev/null +++ b/src/main/java/shape/Decorator.java @@ -0,0 +1,27 @@ +package shape; + +import javafx.geometry.Point2D; +import javafx.scene.canvas.GraphicsContext; + +public abstract class Decorator implements Shape { + protected final Shape decoratedshape; + public Decorator(Shape decoratedShape) { + this.decoratedshape = decoratedShape; + } + @Override + public int pointsCount() { + return decoratedshape.pointsCount(); + } + + @Override + public Point2D point(int index) { + return decoratedshape.point(index); + } + + @Override + public void draw(GraphicsContext context) { + decoratedshape.draw(context); + drawDecoration(context); + } + protected abstract void drawDecoration(GraphicsContext context) ; +} diff --git a/src/main/java/shape/Polygon.java b/src/main/java/shape/Polygon.java new file mode 100644 index 0000000000000000000000000000000000000000..9140320794131795fca7aed9cfd9cf713c133f65 --- /dev/null +++ b/src/main/java/shape/Polygon.java @@ -0,0 +1,29 @@ +package shape; + +import javafx.geometry.Point2D; +import javafx.scene.canvas.GraphicsContext; +import javafx.scene.paint.Color; + +public class Polygon extends AbstractShape { + + private final Color color; + + public Polygon(Color color, Point2D... points) { + this.color = color; + addPoints(points); + } + + + @Override + public void draw(GraphicsContext context) { + context.setStroke(color); + context.beginPath(); + context.moveTo(points.get(0).getX(), points.get(0).getY()); + for (int i = 1; i < pointsCount() ; i++) { + context.lineTo(points.get(i).getX(), points.get(i).getY()); + } + context.closePath(); + context.stroke(); + + } +} diff --git a/src/main/java/shape/Rectangle.java b/src/main/java/shape/Rectangle.java index b0e90627b6345f22ac31ab8bf5fb40f81e4d4f66..efb2f0a8c1921129416949b2c95e29f6d50ab0b3 100644 --- a/src/main/java/shape/Rectangle.java +++ b/src/main/java/shape/Rectangle.java @@ -4,24 +4,26 @@ import javafx.geometry.Point2D; import javafx.scene.canvas.GraphicsContext; import javafx.scene.paint.Color; -public class Rectangle implements Shape{ - Color color; - Rectangle(Color color, Point2D point0, Point2D point1){ +public class Rectangle extends AbstractShape{ + private final Color color; + + public Rectangle(Color color, Point2D point0, Point2D point1){ this.color = color; + addPoints(point0, point1); } @Override - public int pointsCount() { - return 0; - } + public void draw(GraphicsContext context) { + context.setStroke(color); - @Override - public Point2D point(int index) { - return null; - } + Point2D point0 = points.get(0); + Point2D point1 = points.get(1); - @Override - public void draw(GraphicsContext context) { + double x = Math.min(point0.getX(), point1.getX()); + double y = Math.min(point0.getY(), point1.getY()); + double width = Math.abs(point1.getX() - point0.getX()); + double height = Math.abs(point1.getY() - point0.getY()); + context.strokeRect(x,y,width,height); } } diff --git a/src/main/java/shape/ShapeContainer.java b/src/main/java/shape/ShapeContainer.java index 91c7d2977ecd7352ceb7ffbe45f9c541bfd8d45f..aae70ed5e542047b60b0f7147f021811017bdbc7 100644 --- a/src/main/java/shape/ShapeContainer.java +++ b/src/main/java/shape/ShapeContainer.java @@ -9,7 +9,9 @@ public class ShapeContainer{ private List<Shape> shapes = new ArrayList<>(); - public void addShape(Shape shape){} + public void addShape(Shape shape){ + shapes.add(shape); + } public void draw(GraphicsContext context){ for(Shape shape : shapes) diff --git a/src/main/java/state/Drawer.java b/src/main/java/state/Drawer.java index 67b9e1c37ec55c09b9965103ca38cab002b1d815..c6e5f278d50e2910a22e24478b246c9a9679dc87 100644 --- a/src/main/java/state/Drawer.java +++ b/src/main/java/state/Drawer.java @@ -1,7 +1,6 @@ package state; import javafx.scene.canvas.Canvas; -import shape.Circle; import shape.Shape; import java.util.ArrayList;