From f6148c1d09f7ab5c4a248e8555a1c51a049a53cd Mon Sep 17 00:00:00 2001
From: Nirina <andriantsoa.nirina@etu.univ-amu.fr>
Date: Fri, 11 Oct 2024 15:41:33 +0200
Subject: [PATCH] tp3 exercice 1 et 2

---
 .idea/misc.xml                           |  1 -
 src/main/java/shape/AbstractShape.java   | 29 +++++++++++++----
 src/main/java/shape/App.java             | 32 +++++++++++++-----
 src/main/java/shape/BorderDecorator.java | 28 ++++------------
 src/main/java/shape/CenterDecorator.java | 41 +++++++++++-------------
 src/main/java/shape/Circle.java          | 27 +++++++++-------
 src/main/java/shape/Decorator.java       | 26 +++++++++++----
 src/main/java/shape/Polygon.java         | 40 ++++++++---------------
 src/main/java/shape/Rectangle.java       | 27 +++++++++-------
 src/main/java/shape/Shape.java           |  5 ++-
 src/main/java/shape/ShapeContainer.java  |  4 ++-
 11 files changed, 140 insertions(+), 120 deletions(-)

diff --git a/.idea/misc.xml b/.idea/misc.xml
index 480dc8a..47fb4ee 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 09f0e20..c4bc0b0 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 1a519e1..5bf2d41 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 6ba7e31..d413e62 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 0ce6d39..91e8712 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 81d9175..70d9027 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 a24c4ea..bf0d0ab 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 569413e..77ed7f0 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 b0e9062..01d926b 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 61f663c..5472cfe 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 91c7d29..aae70ed 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)
-- 
GitLab