diff --git a/src/main/java/shape/AbstractShape.java b/src/main/java/shape/AbstractShape.java index 4947ec004be002124b6dbc79286c1584483de6f2..db97daddd5da35efae50a2178be048ab9c716e3f 100644 --- a/src/main/java/shape/AbstractShape.java +++ b/src/main/java/shape/AbstractShape.java @@ -3,17 +3,16 @@ 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 { - private List<Point2D> points; - public AbstractShape(List<Point2D> points) { - this.points = points; - } + protected List<Point2D> points = new ArrayList<>(); + public void addPoints(Point2D... points){ - for (Point2D point: points) - this.points.add(point); + this.points.addAll(Arrays.asList(points)); } @Override public int pointsCount() { @@ -22,20 +21,13 @@ public abstract class AbstractShape implements Shape { @Override public Point2D point(int index) { - return index < points.size() ? points.get(index) : null; + if( index >= 0 && index < points.size()){ + return points.get(index); + }else { + throw new IndexOutOfBoundsException("Index out of bounds"); + } } @Override - public void draw(GraphicsContext context) { - if (pointsCount()>0){ - context.beginPath(); - context.moveTo(point(0).getX(), point(0).getY()); - for (int i = 1; i<pointsCount(); i++){ - context.lineTo(point(i).getX(),point(i).getY()); - } - context.closePath(); - context.stroke(); - } - - } + public abstract void draw(GraphicsContext context) ; } diff --git a/src/main/java/shape/App.java b/src/main/java/shape/App.java index 1a519e1401fe032f06aeee35967a27e48ca362fe..c9a1063c2d57595e858c74743e072a69ebb84e5b 100644 --- a/src/main/java/shape/App.java +++ b/src/main/java/shape/App.java @@ -21,12 +21,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 index ff3c0d35ee02299d5eb4543504f0e5cbb5e6855f..bb0865612f230286f105742efda3e9c2a4fe51b0 100644 --- a/src/main/java/shape/BorderDecorator.java +++ b/src/main/java/shape/BorderDecorator.java @@ -6,7 +6,7 @@ import javafx.scene.paint.Color; public class BorderDecorator extends Decorator { - private double radius; + private final double radius; public BorderDecorator(Shape decoratedShape ,double radius) { super(decoratedShape); @@ -15,9 +15,16 @@ public class BorderDecorator extends Decorator { protected void drawDecoration(GraphicsContext context) { context.setStroke(Color.BLACK); context.setLineWidth(2); - for (int i=0; i<pointsCount(); i++){ - Point2D point = point(i); - context.strokeOval(point.getX() - radius, point.getY()- radius,radius*2,radius*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 index eb792b5ce01167369176654f661017d5046ecbc0..8a7c68a07a6b52549afdd6e8ba75520136c3c5d6 100644 --- a/src/main/java/shape/CenterDecorator.java +++ b/src/main/java/shape/CenterDecorator.java @@ -5,23 +5,22 @@ import javafx.scene.canvas.GraphicsContext; import javafx.scene.paint.Color; public class CenterDecorator extends Decorator{ - private double radius; + private final double radius; public CenterDecorator(Shape decoratedShape, double radius) { super(decoratedShape); this.radius = radius; } protected void drawDecoration(GraphicsContext context) { - double centerX = 0; - double centerY = 0; - for (int i =0; i<pointsCount(); i++){ - Point2D point = point(i); - centerX += point.getX(); - centerY += point.getY(); + + 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); } - centerX /= pointsCount(); - centerY /= pointsCount(); - context.setStroke(Color.RED); - context.setLineWidth(2); - 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 index 69ee423b88f6b451de184081bc5b22169cffc625..08bed2e38c7ac74ec230676535c0101f24189c61 100644 --- a/src/main/java/shape/Decorator.java +++ b/src/main/java/shape/Decorator.java @@ -4,7 +4,7 @@ import javafx.geometry.Point2D; import javafx.scene.canvas.GraphicsContext; public abstract class Decorator implements Shape { - protected Shape decoratedshape; + protected final Shape decoratedshape; public Decorator(Shape decoratedShape) { this.decoratedshape = decoratedShape; } @@ -23,7 +23,5 @@ public abstract class Decorator implements Shape { decoratedshape.draw(context); drawDecoration(context); } - protected void drawDecoration(GraphicsContext context) { - - } + protected abstract void drawDecoration(GraphicsContext context) ; } diff --git a/src/main/java/shape/Polygon.java b/src/main/java/shape/Polygon.java index a53b2f408ffb4b9452bd8f9ac5dfbb39c20e65e2..7f417cc2f3e649f485a87fba3246896ac41fbe94 100644 --- a/src/main/java/shape/Polygon.java +++ b/src/main/java/shape/Polygon.java @@ -8,28 +8,24 @@ import java.util.List; public class Polygon extends AbstractShape { - private Color color; + private final Color color; public Polygon(Color color, Point2D... points) { - super(List.of(points)); this.color = color; + addPoints(points); } - @Override - public int pointsCount() { - return super.pointsCount(); - } - - @Override - public Point2D point(int index) { - return super.point(index); - } @Override public void draw(GraphicsContext context) { - context.setFill(color); - super.draw(context); - context.fill(); + 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 e0ee83f4a16e91780f1e755845fd19d6f9fffd3d..c3b272453e674541b0b6aef50587825fe915dab3 100644 --- a/src/main/java/shape/Rectangle.java +++ b/src/main/java/shape/Rectangle.java @@ -7,27 +7,25 @@ import javafx.scene.paint.Color; import java.util.List; public class Rectangle extends AbstractShape{ - private Color color; - Rectangle(Color color, Point2D point0, Point2D point1){ - super(List.of(point0, new Point2D(point1.getX(),point0.getY()), - point1,new Point2D(point0.getX(),point1.getY()))); + private final Color color; + + public Rectangle(Color color, Point2D point0, Point2D point1){ this.color = color; + addPoints(point0, point1); } @Override - public int pointsCount() { - return super.pointsCount(); - } + public void draw(GraphicsContext context) { + context.setStroke(color); - @Override - public Point2D point(int index) { - return super.point(index); - } + Point2D point0 = points.get(0); + Point2D point1 = points.get(1); - @Override - public void draw(GraphicsContext context) { - context.setFill(color); - super.draw(context); - context.fill(); + 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); } }