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