diff --git a/.idea/misc.xml b/.idea/misc.xml index 480dc8a7b94017006a3c6b6c36395e0fff6eaa41..47fb4ee8487e99668c1ee94d3a98d65ba72ca881 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,3 @@ -<?xml version="1.0" encoding="UTF-8"?> <project version="4"> <component name="ExternalStorageConfigurationManager" enabled="true" /> <component name="FrameworkDetectionExcludesConfiguration"> diff --git a/src/main/java/shape/AbstractShape.java b/src/main/java/shape/AbstractShape.java index 09f0e2063b4711565ba03273e1df2ce7068725f7..c4bc0b0f2af6a25f825c0f1810eef64fdd214850 100644 --- a/src/main/java/shape/AbstractShape.java +++ b/src/main/java/shape/AbstractShape.java @@ -1,16 +1,31 @@ package shape; -import java.awt.geom.Point2D; +import javafx.geometry.Point2D; +import java.util.ArrayList; import java.util.List; -public abstract class AbstractShape implements Shape{ - List<Point2D> point; - public AbstractShape(List<Point2D>point){ - this.point=point; +public abstract class AbstractShape implements Shape { + protected List<Point2D> points; + + public AbstractShape() { + this.points = new ArrayList<>(); + } + + public AbstractShape(List<Point2D> points) { + this.points = points; } - public void addPoints(Point2D points){ - point.add(points); + @Override + public int pointsCount() { + return points.size(); } + @Override + public Point2D point(int index) { + return points.get(index); + } + + public void addPoint(Point2D point) { + points.add(point); + } } diff --git a/src/main/java/shape/App.java b/src/main/java/shape/App.java index 1a519e1401fe032f06aeee35967a27e48ca362fe..5bf2d41d8ec60d0295eb59369ab2c07b1f75145e 100644 --- a/src/main/java/shape/App.java +++ b/src/main/java/shape/App.java @@ -7,11 +7,8 @@ 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; - - public class App extends Application { public static void main(String[] args) { @@ -20,16 +17,35 @@ 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(400, 400); 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)); + + Shape borderDecoratedRectangle = new BorderDecorator(rectangle, 5); + + Shape centerDecoratedRectangle = new CenterDecorator(borderDecoratedRectangle, 10); + + shapeContainer.addShape(centerDecoratedRectangle); + + Shape polygon = new Polygon(Color.GREEN, + new Point2D(200, 200), + new Point2D(300, 250), + new Point2D(250, 350)); + + Shape borderDecoratedPolygon = new BorderDecorator(polygon, 5); + + shapeContainer.addShape(borderDecoratedPolygon); + shapeContainer.draw(graphicsContext); + root.getChildren().add(canvas); primaryStage.setScene(new Scene(root)); + primaryStage.setTitle("Shape Decorator Example with Polygon"); primaryStage.show(); } -} \ No newline at end of file +} diff --git a/src/main/java/shape/BorderDecorator.java b/src/main/java/shape/BorderDecorator.java index 6ba7e31534329defe0356a60ddfab4ff39563065..d413e628a093b43efd0bd6f234ff71759148bba4 100644 --- a/src/main/java/shape/BorderDecorator.java +++ b/src/main/java/shape/BorderDecorator.java @@ -1,35 +1,21 @@ package shape; +import javafx.geometry.Point2D; import javafx.scene.canvas.GraphicsContext; -import java.awt.geom.Point2D; - public class BorderDecorator extends Decorator { private double radius; - - public BorderDecorator(Shape decoratedShape, double radius ) { + public BorderDecorator(Shape decoratedShape, double radius) { super(decoratedShape); - this.radius=radius; + this.radius = radius; } @Override public void drawDecoration(GraphicsContext graphicsContext) { - - } - - @Override - public int pointsCount() { - return 0; - } - - @Override - public Point2D point(int index) { - return null; - } - - @Override - public void draw(GraphicsContext context) { - + for (int i = 0; i < decoratedShape.pointsCount(); i++) { + Point2D point = decoratedShape.point(i); + graphicsContext.strokeOval(point.getX() - radius, point.getY() - radius, 2 * radius, 2 * radius); + } } } diff --git a/src/main/java/shape/CenterDecorator.java b/src/main/java/shape/CenterDecorator.java index 0ce6d392e21ac124deabe52087f13c809908a864..91e87124993deb208651a4998b777b2bd189fb50 100644 --- a/src/main/java/shape/CenterDecorator.java +++ b/src/main/java/shape/CenterDecorator.java @@ -1,35 +1,30 @@ package shape; +import javafx.geometry.Point2D; import javafx.scene.canvas.GraphicsContext; -import java.awt.geom.Point2D; - -public class CenterDecorator extends Decorator{ +public class CenterDecorator extends Decorator { private double radius; + public CenterDecorator(Shape decoratedShape, double radius) { super(decoratedShape); - this.radius=radius; - } - - - @Override - public void drawDecoration(GraphicsContext graphicsContext) { - + this.radius = radius; } @Override - public int pointsCount() { - - return 0; - } - - @Override - public Point2D point(int index) { - return null; - } - - @Override - public void draw(GraphicsContext context) { - + protected void drawDecoration(GraphicsContext graphicsContext) { + if (decoratedShape.pointsCount() >= 2) { + Point2D p1 = decoratedShape.point(0); + Point2D p2 = decoratedShape.point(1); + + // Calculer le centre comme la moyenne des coordonnées des deux premiers points + double centerX = (p1.getX() + p2.getX()) / 2; + double centerY = (p1.getY() + p2.getY()) / 2; + + // Dessiner un cercle autour du centre calculé + graphicsContext.strokeOval(centerX - radius, centerY - radius, 2 * radius, 2 * radius); + } else { + System.err.println("The decorated shape must have at least two points to calculate a center."); + } } } diff --git a/src/main/java/shape/Circle.java b/src/main/java/shape/Circle.java index 81d9175dc3977c5c95dec3693569c12ad12d8315..70d90277768d84ecf61e18065cebc5902d99f57f 100644 --- a/src/main/java/shape/Circle.java +++ b/src/main/java/shape/Circle.java @@ -2,24 +2,27 @@ package shape; import javafx.geometry.Point2D; import javafx.scene.canvas.GraphicsContext; +import javafx.scene.paint.Color; -public class Circle implements Shape { +public class Circle extends AbstractShape { + private Color color; + private double radius; - public Circle(double x, double y, double sqrt) { - } - - @Override - public int pointsCount() { - return 0; - } - - @Override - public Point2D point(int index) { - return null; + public Circle(Color color, Point2D center, double radius) { + super(); + this.color = color; + this.radius = radius; + addPoint(center); } @Override public void draw(GraphicsContext context) { + Point2D center = point(0); + double x = center.getX() - radius; + double y = center.getY() - radius; + double diameter = 2 * radius; + context.setFill(color); + context.fillOval(x, y, diameter, diameter); } } diff --git a/src/main/java/shape/Decorator.java b/src/main/java/shape/Decorator.java index a24c4eaa4b84a037962c314c7aa1f45337a3f318..bf0d0ab69319bccbc7b53b79008f89403244e83d 100644 --- a/src/main/java/shape/Decorator.java +++ b/src/main/java/shape/Decorator.java @@ -1,16 +1,30 @@ package shape; +import javafx.geometry.Point2D; import javafx.scene.canvas.GraphicsContext; -import java.awt.geom.Point2D; +public abstract class Decorator implements Shape { + protected Shape decoratedShape; -public abstract class Decorator implements Shape { - private Shape decoratedShape; - public Decorator(Shape decoratedShape){ - this.decoratedShape=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); + } - public abstract void drawDecoration(GraphicsContext graphicsContext); + @Override + public void draw(GraphicsContext graphicsContext) { + decoratedShape.draw(graphicsContext); + drawDecoration(graphicsContext); + } + protected abstract void drawDecoration(GraphicsContext graphicsContext); } diff --git a/src/main/java/shape/Polygon.java b/src/main/java/shape/Polygon.java index 569413effbce9b184c6e0fa92517a03ba2990345..77ed7f0a2cf67338110f34d7c07e32e5a3ec44f6 100644 --- a/src/main/java/shape/Polygon.java +++ b/src/main/java/shape/Polygon.java @@ -1,39 +1,27 @@ package shape; +import javafx.geometry.Point2D; import javafx.scene.canvas.GraphicsContext; +import javafx.scene.paint.Color; -import java.awt.geom.Point2D; -import java.util.List; +import java.util.Arrays; -public class Polygon extends AbstractShape{ +public class Polygon extends AbstractShape { + private Color color; - public Polygon(List<Point2D> point) { - super(point); - } - - @Override - public void addPoints(Point2D points) { - super.point.add(points); - - } - - @Override - public int pointsCount() { - int result=0; - for(Point2D a:point){ - result+=1; - } - return result; - - } - - @Override - public Point2D point(int index) { - return point.get( index); + public Polygon(Color color, Point2D... points) { + super(Arrays.asList(points)); + this.color = color; } @Override public void draw(GraphicsContext context) { + if (pointsCount() < 2) return; + + double[] xPoints = points.stream().mapToDouble(Point2D::getX).toArray(); + double[] yPoints = points.stream().mapToDouble(Point2D::getY).toArray(); + context.setFill(color); + context.fillPolygon(xPoints, yPoints, pointsCount()); } } diff --git a/src/main/java/shape/Rectangle.java b/src/main/java/shape/Rectangle.java index b0e90627b6345f22ac31ab8bf5fb40f81e4d4f66..01d926b9701b232cebb420bc010a196354018879 100644 --- a/src/main/java/shape/Rectangle.java +++ b/src/main/java/shape/Rectangle.java @@ -4,24 +4,27 @@ 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){ - this.color = color; - } +import java.util.Arrays; - @Override - public int pointsCount() { - return 0; - } +public class Rectangle extends AbstractShape { + private Color color; - @Override - public Point2D point(int index) { - return null; + public Rectangle(Color color, Point2D point1, Point2D point2) { + super(Arrays.asList(point1, point2)); + this.color = color; } @Override public void draw(GraphicsContext context) { + Point2D p1 = point(0); + Point2D p2 = point(1); + + double x = Math.min(p1.getX(), p2.getX()); + double y = Math.min(p1.getY(), p2.getY()); + double width = Math.abs(p1.getX() - p2.getX()); + double height = Math.abs(p1.getY() - p2.getY()); + context.setFill(color); + context.fillRect(x, y, width, height); } } diff --git a/src/main/java/shape/Shape.java b/src/main/java/shape/Shape.java index 61f663c177a5b36aa5ec4a48259f018dadb91806..5472cfe0cd9f671bfb0aaa1df227b0c0d8a5f64d 100644 --- a/src/main/java/shape/Shape.java +++ b/src/main/java/shape/Shape.java @@ -1,11 +1,10 @@ package shape; +import javafx.geometry.Point2D; import javafx.scene.canvas.GraphicsContext; -import java.awt.geom.Point2D; - public interface Shape { int pointsCount(); Point2D point(int index); - void draw(GraphicsContext context); + void draw(GraphicsContext graphicsContext); } 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)