From 891d8e82dec9aa3e84b3d6f7a12dd736572e1bee Mon Sep 17 00:00:00 2001
From: m19023837 <chadi.mansour@etu.univ-amu.fr>
Date: Fri, 27 Sep 2024 11:21:30 +0200
Subject: [PATCH] correcting the code

---
 src/main/java/shape/AbstractShape.java   | 30 +++++++++---------------
 src/main/java/shape/App.java             | 16 +++++++++----
 src/main/java/shape/BorderDecorator.java | 15 ++++++++----
 src/main/java/shape/CenterDecorator.java | 23 +++++++++---------
 src/main/java/shape/Decorator.java       |  6 ++---
 src/main/java/shape/Polygon.java         | 24 ++++++++-----------
 src/main/java/shape/Rectangle.java       | 30 +++++++++++-------------
 7 files changed, 71 insertions(+), 73 deletions(-)

diff --git a/src/main/java/shape/AbstractShape.java b/src/main/java/shape/AbstractShape.java
index 4947ec0..db97dad 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 1a519e1..c9a1063 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 ff3c0d3..bb08656 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 eb792b5..8a7c68a 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 69ee423..08bed2e 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 a53b2f4..7f417cc 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 e0ee83f..c3b2724 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);
     }
 }
-- 
GitLab