diff --git a/src/test/java/org/example/chaosgame/.idea/vcs.xml b/.idea/vcs.xml similarity index 64% rename from src/test/java/org/example/chaosgame/.idea/vcs.xml rename to .idea/vcs.xml index 821e530ddc3b630be065c610c6d0f2f9dfba9472..35eb1ddfbbc029bcab630581847471d7f238ec53 100644 --- a/src/test/java/org/example/chaosgame/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <project version="4"> <component name="VcsDirectoryMappings"> - <mapping directory="$PROJECT_DIR$/../../../../../.." vcs="Git" /> + <mapping directory="" vcs="Git" /> </component> </project> \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000000000000000000000000000000000000..8e073c1a3641d5a6040b55eaeb505c17cefa9889 --- /dev/null +++ b/README.md @@ -0,0 +1,178 @@ +# Portfolio project IDATT2003 - 2024 + +GROUP ID = "0019" + +STUDENT NAME = "Vetle Solheim Hodne" +<br> +STUDENT ID = "10013" + + +STUDENT NAME = "Edvard Berdal Eek" +<br> +STUDENT ID = "10036" + + +## Project description + +This project revolves around visual representation of fractals. +The chaos game is a method for creating fractals by randomly placing points +in a plane and then moving a point towards the randomly placed points. +With affine transformations, the chaos game can be used to create fractals such as the Sierpinski triangle and the Barnsley fern. +Here the points are applied a random transformation from a set of transformations. + +Chaos Julia-transformations are can be created by iterating a complex through a function, which takes the square root of +the sum of the complex number and another a constant complex number then randomly selects the +sign to be positive or negative, and then plotting the result. + +## Project structure + + +- `IDATT2003-2024-0019-ChaosGame` + - `src/` (folder for source files) + - `main/` + - `java/` + - `edu.ntnu.stud/` + - `controller` (package for controller classes) + - `interfaces` (package for interfaces in controller package) + - `GameController.java` (interface for game controllers) + - `Observer.java` (interface for observer implementation) + - `Subject.java` (interface for subject implementation) + - `ChaosGameController.java` (controller for chaos game) + - `ChaosGameDescriptionFactory.java` (factory pattern for chaos game descriptions) + - `ChaosGameFileHandler.java` (file handler for chaos games) + - `ExploreGameController.java` (controller for explore game) + - `HomeController.java` (controller for home page) + - `PageController.java` (controller for pages) + - `model` (package for running the program) + - `chaos` (package for fractal game related entity classes) + - `ChaosCanvas.java` (class for chaos canvas) + - `ChaosGame.java` (class for chaos game) + - `ChaosGameDescription.java` (class for chaos game description) + - `ChaosGameType.java` (enum for chaos game type) + - `ExploreGame.java` (class for explore game) + - `linalg` (package for linear algebra related classes) + - `Complex.java` (class for complex numbers) + - `Matrix2x2.java` (class for 2x2 matrices) + - `Vector2D.java` (class for 2D vectors) + - `transformations` (package for transformations related classes) + - `AffineTransform2D.java` (class for affine transformations) + - `ExploreJulia.java` (class for explore julia) + - `JuliaTransform.java` (class for julia transformations) + - `Trandsform2D.java` (interface for 2D transformations) + - `view` (package for view classes) + - `ChaosPage.java` (view class for chaos game) + - `ExplorePage.java` (view class for explore game) + - `GamePage.java` (abstract class for game pages) + - `HomePage.java` (view class for the home page) + - `module-info.java` (module info file) + - `resources/` (folder for resources) + - `media/` (folder for css files) + - `ChaosVideoFinal.mp4` (image for chaos game) + - `ExploreVideoFinal.mp4` (image for explore game) + - `White-home-icon.png` (image for home page) + - `stylesheets/` (folder for fxml files) + - `style.css` (css file for styling the application) + - `testFiles/` (folder for images) + - `barnsley.txt` (text file for barnsley fern) + - `juila.txt` (text file for julia set) + - `sierpinski.txt` (text file for sierpinski triangle) + + - `test/` (folder for JUnit-tests) + - `java/` + - `edu.ntnu.stud/` + - `controller` (package for controller classes) + - `interfaces` (package for interfaces in controller package) + - `GameControllerTest.java` (interface for game controllers) + - `ObserverTest.java` (interface for observer implementation) + - `SubjectTest.java` (interface for subject implementation) + - `ChaosGameControllerTest.java` (controller for chaos game) + - `ChaosGameDescriptionFactoryTest.java` (factory pattern for chaos game descriptions) + - `ChaosGameFileHandlerTest.java` (file handler for chaos games) + - `ExploreGameControllerTest.java` (controller for explore game) + - `HomeControllerTest.java` (controller for home page) + - `PageControllerTest.java` (controller for pages) + - `model` (package for running the program) + - `chaos` (package for fractal game related entity classes) + - `ChaosCanvasTest.java` (class for chaos canvas) + - `ChaosGameTest.java` (class for chaos game) + - `ChaosGameDescriptionTest.java` (class for chaos game description) + - `ChaosGameTypeTest.java` (enum for chaos game type) + - `ExploreGameTest.java` (class for explore game) + - `linalg` (package for linear algebra related classes) + - `ComplexTest.java` (class for complex numbers) + - `Matrix2x2Test.java` (class for 2x2 matrices) + - `Vector2DTest.java` (class for 2D vectors) + - `transformations` (package for transformations related classes) + - `AffineTransform2DTest.java` (class for affine transformations) + - `ExploreJuliaTest.java` (class for explore julia) + - `JuliaTransformTest.java` (class for julia transformations) +## Link to repository +[//]: # (TODO: Include a link to your repository here.) +> https://gitlab.stud.idi.ntnu.no/idatt2003-19/chaosgame + + +## How to run the project + +[//]: # (TODO: Describe how to run your project here. What is the main class? What is the main method? +What is the input and output of the program? What is the expected behaviour of the program?) + +To run the program, run the main method in the MainApp class in the IDE of your choise. + +Or use the following command your terminal: + +``` +mvn javafx:run +``` +The program runs from the Main-class. +<p>Go to ChaosGame -> src -> main -> java -> edu.ntnu.stud -> Main and press run. + +This runs the main method in the MainApp class which then runs the launch method for the application. + +The user is presented with a home page that is split in the middle, one for the chaos game and one for the explore game. +when the user hovers over the chaos game, a video of the chaos game is displayed. +When the user hovers over the explore game, a video of the explore game is displayed. +The user can click on the chaos game to play the chaos game, or click on the explore game to play the explore game. + +In the chaos game the user can choose between displaying julia sets or affine fractals. +The user types in the amount of iterations the game should attempt to place a pixel. +They can also create their own fractals +The user can choose between displaying julia sets or affine fractals with a so-called chaos game. + +In the explore game the user can explore the julia set by sliding the real and imaginary part sliders +changing the parts of the complex number which is used to display the fractal. +The zoom is used by scrolling and works both with and without a mouse. +In addition, there buttons to zoom in and out, +reset the image and a color picker allowing the user to change the color of the fractal + +For each page the user can choose to go back to the home page by clicking the home icon in the top left corner. + +On the home page there is a exit button in the bottom center of the application + +## How to run the tests + +[//]: # (TODO: Describe how to run the tests here.) +Tests can be run by typing the following in the terminal: + +``` +mvn test +``` +or + +``` +mvn clean test +``` + +<br> +With IntelliJ IDEA, the tests can be run by right-clicking the edu.ntnu.stud package, either within the test or main folder, +and selecting "Run 'Tests in edu.ntnu.stud'". If you want to run tests with coverage, +right-click the edu.ntnu.stud package and select "More Run/Debug" and then "Run 'Tests in edu.ntnu.stud' with Coverage". +The same can be done specific classes within the package. +## References + + +## References +[//]: # (TODO: Include references here, if any. For example, if you have used code from the course book, include a reference to the chapter. +Or if you have used code from a website or other source, include a link to the source.) + +- [Chaos Game (wikipedia)](https://en.wikipedia.org/wiki/Chaos_game) +- [Julia Set (wikipedia)](https://en.wikipedia.org/wiki/Julia_set) diff --git a/Rapportmal IDATx2003.dotx b/Rapportmal IDATx2003.dotx deleted file mode 100644 index c235173c70cf36908e3097b3dc226ecf76d8a174..0000000000000000000000000000000000000000 Binary files a/Rapportmal IDATx2003.dotx and /dev/null differ diff --git a/pom.xml b/pom.xml index 250218dcad301f8f9f114f237cb1409fd19eb9c5..1c475bbd07c5174c768a4c245bf346388a6f33c0 100644 --- a/pom.xml +++ b/pom.xml @@ -4,27 +4,39 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> - <groupId>org.example</groupId> + <groupId>org.idatt2003</groupId> <artifactId>ChaosGame</artifactId> <version>1.0-SNAPSHOT</version> <name>ChaosGame</name> + <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <junit.version>5.10.0</junit.version> </properties> + + <!-- Dependencies --> <dependencies> + <!-- JavaFX controls--> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-controls</artifactId> <version>21</version> </dependency> + <!-- JavaFX fxml--> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-fxml</artifactId> <version>21</version> </dependency> + <!-- JavaFX media--> + <dependency> + <groupId>org.openjfx</groupId> + <artifactId>javafx-media</artifactId> + <version>21.0.2</version> + </dependency> + <!-- JUnit 5 engine and api dependencies --> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> @@ -37,11 +49,11 @@ <version>${junit.version}</version> <scope>test</scope> </dependency> - <dependency> - <groupId>org.openjfx</groupId> - <artifactId>javafx-media</artifactId> - <version>21.0.2</version> - </dependency> + + <!-- Mockito Dependencies --> + <!-- Tried to implement mockito in controller + testing, but did not work because + controller classes uses JavaFX components--> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> @@ -54,8 +66,6 @@ <version>3.12.4</version> <scope>test</scope> </dependency> - - <!-- Mockito JUnit Jupiter Dependency --> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-junit-jupiter</artifactId> @@ -64,9 +74,11 @@ </dependency> </dependencies> + <!-- Build configuration --> <build> <plugins> <plugin> + <!-- Compiler plugin --> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> @@ -76,6 +88,7 @@ </configuration> </plugin> <plugin> + <!-- JavaFX plugin --> <groupId>org.openjfx</groupId> <artifactId>javafx-maven-plugin</artifactId> <version>0.0.8</version> @@ -84,7 +97,7 @@ <!-- Default configuration for running with: mvn clean javafx:run --> <id>default-cli</id> <configuration> - <mainClass>org.example.chaosgame/org.example.chaosgame.MainApp</mainClass> + <mainClass>org.idatt2003/org.idatt2003.MainApp</mainClass> <launcher>app</launcher> <jlinkZipName>app</jlinkZipName> <jlinkImageName>app</jlinkImageName> diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index c70812699bb333697db7104f6b1f23d8790fafdf..49050d498d8591559b60367b212f8731e8533c59 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -1,9 +1,9 @@ -module org.example.chaosgame { +module org.idatt2003 { requires javafx.controls; requires javafx.fxml; requires javafx.media; - opens org.example.chaosgame to javafx.fxml; - exports org.example.chaosgame; + opens org.idatt2003 to javafx.fxml; + exports org.idatt2003; } \ No newline at end of file diff --git a/src/main/java/org/example/chaosgame/model/transformations/Transform2D.java b/src/main/java/org/example/chaosgame/model/transformations/Transform2D.java deleted file mode 100644 index c97d56a76b4b050050d7a306ad13bf2b04da1c43..0000000000000000000000000000000000000000 --- a/src/main/java/org/example/chaosgame/model/transformations/Transform2D.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.example.chaosgame.model.transformations; - -import org.example.chaosgame.model.linalg.Vector2D; - -/** - * Interface for 2D transformations. - */ -public interface Transform2D { - Vector2D transform(Vector2D point); -} diff --git a/src/main/java/org/example/chaosgame/Main.java b/src/main/java/org/idatt2003/Main.java similarity index 88% rename from src/main/java/org/example/chaosgame/Main.java rename to src/main/java/org/idatt2003/Main.java index 2e188dd5c1e626f16eed47f1693d428d4f341e21..57b87ad335c8f5d82d91333a0efcb23a5f69b774 100644 --- a/src/main/java/org/example/chaosgame/Main.java +++ b/src/main/java/org/idatt2003/Main.java @@ -1,4 +1,4 @@ -package org.example.chaosgame; +package org.idatt2003; /** * Main class for the application. diff --git a/src/main/java/org/example/chaosgame/MainApp.java b/src/main/java/org/idatt2003/MainApp.java similarity index 84% rename from src/main/java/org/example/chaosgame/MainApp.java rename to src/main/java/org/idatt2003/MainApp.java index 9ee9023fea2108cfdcccbac8cfcc9c1ea564c2ab..5c4bee1c936f9e681f56019c23078fdfdd8ee4cf 100644 --- a/src/main/java/org/example/chaosgame/MainApp.java +++ b/src/main/java/org/idatt2003/MainApp.java @@ -1,13 +1,13 @@ -package org.example.chaosgame; +package org.idatt2003; import java.util.Objects; import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.layout.StackPane; import javafx.stage.Stage; -import org.example.chaosgame.controller.ChaosGameController; -import org.example.chaosgame.controller.ExploreGameController; -import org.example.chaosgame.controller.PageController; +import org.idatt2003.controller.ChaosGameController; +import org.idatt2003.controller.ExploreGameController; +import org.idatt2003.controller.PageController; /** * This is the main class for the JavaFX application. diff --git a/src/main/java/org/example/chaosgame/view/GamePage.java b/src/main/java/org/idatt2003/controller/CanvasPainter.java similarity index 66% rename from src/main/java/org/example/chaosgame/view/GamePage.java rename to src/main/java/org/idatt2003/controller/CanvasPainter.java index 8217f98513996bd19e21e588524516d3545d3cee..b060de82a0614d0dc9ed498175bee449d2041bff 100644 --- a/src/main/java/org/example/chaosgame/view/GamePage.java +++ b/src/main/java/org/idatt2003/controller/CanvasPainter.java @@ -1,51 +1,39 @@ -package org.example.chaosgame.view; +package org.idatt2003.controller; -import javafx.scene.canvas.Canvas; import javafx.scene.canvas.GraphicsContext; import javafx.scene.image.PixelWriter; import javafx.scene.image.WritableImage; -import javafx.scene.layout.BorderPane; import javafx.scene.paint.Color; -import org.example.chaosgame.model.chaos.ChaosCanvas; +import org.idatt2003.model.chaos.ChaosCanvas; + /** - * Abstract class for the GamePage, extends BorderPane. - * The GamePage is used for displaying the game. + * Abstract class for the CanvasPainter. + * The CanvasPainter is used for painting a fractal + * on the canvas. + * All methods are public and static. */ -public abstract class GamePage extends BorderPane { - protected final GraphicsContext gc; +public abstract class CanvasPainter { + protected Color fractalColor = Color.WHITE; private static final int COLOR_FACTOR = 3; - private static final int CANVAS_WIDTH = 1250; - private static final int CANVAS_HEIGHT = 805; private static final int MAX_COLOR_VALUE = 255; - protected Color fractalColor; - - /** - * Constructor for the GamePage. - * Initializes the canvas and fractal color. - */ - public GamePage() { - this.gc = createCanvas(); - this.fractalColor = Color.WHITE; - } /** - * Method for setting color of the fractal. + * Method for painting the canvas. + * Draws the canvas on the graphics context. + * Use the method createOffScreenImage to create the offscreen image. * - * @param newFractalColor the new fractal color + * @param chaosCanvas the chaos canvas + * @param gc the graphics context */ - public void setFractalColor(Color newFractalColor) { - this.fractalColor = newFractalColor; - } + private void drawCanvas(ChaosCanvas chaosCanvas, GraphicsContext gc) { + double[][] canvasArray = chaosCanvas.getCanvasArray(); + double cellWidth = gc.getCanvas().getWidth() / chaosCanvas.getWidth(); + double cellHeight = gc.getCanvas().getHeight() / chaosCanvas.getHeight(); - /** - * Method for creating the canvas. - * - * @return the GraphicsContext - */ - private GraphicsContext createCanvas() { - Canvas canvas = new Canvas(CANVAS_WIDTH, CANVAS_HEIGHT); - return canvas.getGraphicsContext2D(); + WritableImage offScreenImage = createOffScreenImage(chaosCanvas, canvasArray); + gc.drawImage(offScreenImage, 0, 0, cellWidth * chaosCanvas.getWidth(), + cellHeight * chaosCanvas.getHeight()); } /** @@ -54,31 +42,20 @@ public abstract class GamePage extends BorderPane { * * @param chaosCanvas the chaos canvas */ - public void updateCanvas(ChaosCanvas chaosCanvas) { - clearCanvas(); - drawCanvas(chaosCanvas); + protected void updateCanvas(ChaosCanvas chaosCanvas, GraphicsContext gc) { + this.clearCanvas(gc); + drawCanvas(chaosCanvas, gc); } /** * Method for clearing the canvas. - */ - public void clearCanvas() { - gc.clearRect(0, 0, gc.getCanvas().getWidth(), gc.getCanvas().getHeight()); - } - - /** - * Method for drawing the canvas. + * Clears entire GraphicsContext canvas with built-in + * clearRect method. * - * @param chaosCanvas the chaos canvas + * @param gc the graphics context */ - private void drawCanvas(ChaosCanvas chaosCanvas) { - double[][] canvasArray = chaosCanvas.getCanvasArray(); - double cellWidth = gc.getCanvas().getWidth() / chaosCanvas.getWidth(); - double cellHeight = gc.getCanvas().getHeight() / chaosCanvas.getHeight(); - - WritableImage offScreenImage = createOffScreenImage(chaosCanvas, canvasArray); - gc.drawImage(offScreenImage, 0, 0, cellWidth * chaosCanvas.getWidth(), - cellHeight * chaosCanvas.getHeight()); + protected void clearCanvas(GraphicsContext gc) { + gc.clearRect(0, 0, gc.getCanvas().getWidth(), gc.getCanvas().getHeight()); } /** @@ -112,4 +89,13 @@ public abstract class GamePage extends BorderPane { return offScreenImage; } + + /** + * Method for setting color of the fractal. + * + * @param newFractalColor the new fractal color + */ + protected void setFractalColor(Color newFractalColor) { + fractalColor = newFractalColor; + } } diff --git a/src/main/java/org/example/chaosgame/controller/ChaosGameController.java b/src/main/java/org/idatt2003/controller/ChaosGameController.java similarity index 84% rename from src/main/java/org/example/chaosgame/controller/ChaosGameController.java rename to src/main/java/org/idatt2003/controller/ChaosGameController.java index cb8678ba34d88366259e2af8b082804b159dec34..488c8c7737814bce511129e975d9c60dcc826bef 100644 --- a/src/main/java/org/example/chaosgame/controller/ChaosGameController.java +++ b/src/main/java/org/idatt2003/controller/ChaosGameController.java @@ -1,4 +1,4 @@ -package org.example.chaosgame.controller; +package org.idatt2003.controller; import java.io.File; import java.io.IOException; @@ -12,22 +12,22 @@ import javafx.scene.layout.StackPane; import javafx.scene.paint.Color; import javafx.stage.FileChooser; import javafx.util.Pair; -import org.example.chaosgame.controller.interfaces.GameController; -import org.example.chaosgame.controller.interfaces.Observer; -import org.example.chaosgame.controller.interfaces.Subject; -import org.example.chaosgame.model.chaos.ChaosGame; -import org.example.chaosgame.model.chaos.ChaosGameDescription; -import org.example.chaosgame.model.chaos.ChaosGameType; -import org.example.chaosgame.model.linalg.Complex; -import org.example.chaosgame.model.linalg.Matrix2x2; -import org.example.chaosgame.model.linalg.Vector2D; -import org.example.chaosgame.model.transformations.AffineTransform2D; -import org.example.chaosgame.model.transformations.JuliaTransform; -import org.example.chaosgame.model.transformations.Transform2D; -import org.example.chaosgame.view.ChaosPage; -import org.example.chaosgame.view.components.AlertUtility; -import org.example.chaosgame.view.components.CreateFractalDialog; -import org.example.chaosgame.view.components.MinMaxDialog; +import org.idatt2003.controller.interfaces.GameController; +import org.idatt2003.controller.interfaces.Observer; +import org.idatt2003.controller.interfaces.Subject; +import org.idatt2003.model.chaos.ChaosGame; +import org.idatt2003.model.chaos.ChaosGameDescription; +import org.idatt2003.model.chaos.ChaosGameType; +import org.idatt2003.model.linalg.Complex; +import org.idatt2003.model.linalg.Matrix2x2; +import org.idatt2003.model.linalg.Vector2D; +import org.idatt2003.model.transformations.AffineTransform2D; +import org.idatt2003.model.transformations.JuliaTransform; +import org.idatt2003.model.transformations.Transform2D; +import org.idatt2003.view.ChaosPage; +import org.idatt2003.view.components.AlertUtility; +import org.idatt2003.view.components.CreateFractalDialog; +import org.idatt2003.view.components.MinMaxDialog; /** * Controller class for the chaos game. @@ -37,7 +37,8 @@ import org.example.chaosgame.view.components.MinMaxDialog; * * <p>Implements the GameController interface. */ -public class ChaosGameController implements Observer, Subject, GameController { +public class ChaosGameController extends CanvasPainter + implements Observer, Subject, GameController { private final ChaosGame chaosGame; private final ChaosPage chaosPage; private final List<Observer> pageObservers; @@ -49,7 +50,8 @@ public class ChaosGameController implements Observer, Subject, GameController { * Constructor for the ChaosGameController. * * <p>Initializes the ChaosGame and ChaosPage. - * Register the ChaosGame as an observer. + * Registers the controller as an observer of the + * chaos game * */ public ChaosGameController() { @@ -81,6 +83,7 @@ public class ChaosGameController implements Observer, Subject, GameController { /** * Method for selecting a new ChaosGameDescription. + * Uses the ChaosGameDescriptionFactory to change the game * * @param selectedGame Name of the selected game */ @@ -131,9 +134,10 @@ public class ChaosGameController implements Observer, Subject, GameController { /** * Method for setting the min and max coordinates for the chaos game. + * Updates the ChaosGameDescription to the new coordinate values. + * Catches different exceptions and displays a fitting message to user. * * <p>Opens a dialog for the user to enter the coordinates. - * */ public void setMaxMinCoords() { MinMaxDialog dialog = new MinMaxDialog(); @@ -148,7 +152,8 @@ public class ChaosGameController implements Observer, Subject, GameController { Double.parseDouble(coords.get(3))); updateChaosGame(new ChaosGameDescription(min, max, - chaosGame.getDescription().getTransforms())); + chaosGame.getDescription().getTransforms(), + chaosGame.getDescription().getProbabilities())); } catch (NumberFormatException e) { AlertUtility.showErrorDialog("Invalid input", "Please enter a valid number."); @@ -190,7 +195,7 @@ public class ChaosGameController implements Observer, Subject, GameController { /** * Method for user creation of fractal. - * {@link org.example.chaosgame.view.components.CreateFractalDialog} returns either a + * {@link CreateFractalDialog} returns either a * {@link java.util.List}<{@link java.util.List}<{@link java.lang.String}>> * or a {@link javafx.util.Pair}<{@link java.lang.String}, {@link java.lang.String}>. * @@ -268,6 +273,9 @@ public class ChaosGameController implements Observer, Subject, GameController { /** * Method for resetting the chaos game. + * Resets the total steps. + * Updates the information on the chaos page's top bar + * and clears both the ChaosCanvas and the canvas */ public void resetGame() { chaosGame.resetTotalSteps(); @@ -275,7 +283,8 @@ public class ChaosGameController implements Observer, Subject, GameController { chaosGame.getTotalSteps(), chaosGame.getDescription().getMinCoords(), chaosGame.getDescription().getMaxCoords()); - chaosPage.clearCanvas(); + chaosGame.getCanvas().clearCanvas(); + clearCanvas(chaosPage.getGraphicsContext()); } @Override @@ -320,12 +329,21 @@ public class ChaosGameController implements Observer, Subject, GameController { } } + /** + * Method for updating the fractal color. + * Sets the color than updates the canvas with the new color. + * + * @param color the new color. + */ @Override public void updateFractalColor(Color color) { - chaosPage.setFractalColor(color); - chaosPage.updateCanvas(chaosGame.getCanvas()); + setFractalColor(color); + updateCanvas(chaosGame.getCanvas(), chaosPage.getGraphicsContext()); } + /** + * Notifies the page observers when the button is clicked. + */ @Override public void homeButtonClicked() { notifyObservers(); @@ -341,11 +359,11 @@ public class ChaosGameController implements Observer, Subject, GameController { chaosGame.getTotalSteps(), chaosGame.getDescription().getMinCoords(), chaosGame.getDescription().getMaxCoords()); - chaosPage.updateCanvas(chaosGame.getCanvas()); + updateCanvas(chaosGame.getCanvas(), chaosPage.getGraphicsContext()); } /** - * Method for registering observers. + * Method for registering page observers. * * @param observer Observer to register */ @@ -355,7 +373,7 @@ public class ChaosGameController implements Observer, Subject, GameController { } /** - * Method for removing observers. + * Method for removing page observers. * * @param observer Observer to remove */ @@ -365,7 +383,10 @@ public class ChaosGameController implements Observer, Subject, GameController { } /** - * Method for notifying observers. + * Method for notifying page observers. + * Notifies if the displaying pages should + * be changed. + * */ @Override public void notifyObservers() { diff --git a/src/main/java/org/example/chaosgame/controller/ChaosGameDescriptionFactory.java b/src/main/java/org/idatt2003/controller/ChaosGameDescriptionFactory.java similarity index 85% rename from src/main/java/org/example/chaosgame/controller/ChaosGameDescriptionFactory.java rename to src/main/java/org/idatt2003/controller/ChaosGameDescriptionFactory.java index db3de3d27fb79488505c1f1d61df2ad70bffb01a..583a6f25936d149103893a050690650395dfe226 100644 --- a/src/main/java/org/example/chaosgame/controller/ChaosGameDescriptionFactory.java +++ b/src/main/java/org/idatt2003/controller/ChaosGameDescriptionFactory.java @@ -1,16 +1,17 @@ -package org.example.chaosgame.controller; +package org.idatt2003.controller; import java.util.List; -import org.example.chaosgame.model.chaos.ChaosGameDescription; -import org.example.chaosgame.model.chaos.ChaosGameType; -import org.example.chaosgame.model.linalg.Complex; -import org.example.chaosgame.model.linalg.Matrix2x2; -import org.example.chaosgame.model.linalg.Vector2D; -import org.example.chaosgame.model.transformations.AffineTransform2D; -import org.example.chaosgame.model.transformations.JuliaTransform; +import org.idatt2003.model.chaos.ChaosGameDescription; +import org.idatt2003.model.chaos.ChaosGameType; +import org.idatt2003.model.linalg.Complex; +import org.idatt2003.model.linalg.Matrix2x2; +import org.idatt2003.model.linalg.Vector2D; +import org.idatt2003.model.transformations.AffineTransform2D; +import org.idatt2003.model.transformations.JuliaTransform; /** * Factory class for creating ChaosGameDescription objects. + * Creates a ChaosGameDescription object based on the ChaosGameType-enum. */ public class ChaosGameDescriptionFactory { diff --git a/src/main/java/org/example/chaosgame/controller/ChaosGameFileHandler.java b/src/main/java/org/idatt2003/controller/ChaosGameFileHandler.java similarity index 93% rename from src/main/java/org/example/chaosgame/controller/ChaosGameFileHandler.java rename to src/main/java/org/idatt2003/controller/ChaosGameFileHandler.java index 050be3f8ffd4d511b5a88037a999ac96028cce6c..8499213dd7c981adc12645fa02f6900e4ef0a077 100644 --- a/src/main/java/org/example/chaosgame/controller/ChaosGameFileHandler.java +++ b/src/main/java/org/idatt2003/controller/ChaosGameFileHandler.java @@ -1,4 +1,4 @@ -package org.example.chaosgame.controller; +package org.idatt2003.controller; import java.io.BufferedReader; import java.io.BufferedWriter; @@ -7,16 +7,17 @@ import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.List; -import org.example.chaosgame.model.chaos.ChaosGameDescription; -import org.example.chaosgame.model.linalg.Complex; -import org.example.chaosgame.model.linalg.Matrix2x2; -import org.example.chaosgame.model.linalg.Vector2D; -import org.example.chaosgame.model.transformations.AffineTransform2D; -import org.example.chaosgame.model.transformations.JuliaTransform; -import org.example.chaosgame.model.transformations.Transform2D; +import org.idatt2003.model.chaos.ChaosGameDescription; +import org.idatt2003.model.linalg.Complex; +import org.idatt2003.model.linalg.Matrix2x2; +import org.idatt2003.model.linalg.Vector2D; +import org.idatt2003.model.transformations.AffineTransform2D; +import org.idatt2003.model.transformations.JuliaTransform; +import org.idatt2003.model.transformations.Transform2D; /** * Class for reading and writing chaos game descriptions from and to files. + * The class can read and write chaos game descriptions to text files. */ public class ChaosGameFileHandler { private final List<Transform2D> transforms = new ArrayList<>(); diff --git a/src/main/java/org/example/chaosgame/controller/ExploreGameController.java b/src/main/java/org/idatt2003/controller/ExploreGameController.java similarity index 79% rename from src/main/java/org/example/chaosgame/controller/ExploreGameController.java rename to src/main/java/org/idatt2003/controller/ExploreGameController.java index b6ae5e8cfac2ea62c8c1e05d13df1bce44c5b727..2433d3a3866dfd6cf0d39099c3d041df789b8734 100644 --- a/src/main/java/org/example/chaosgame/controller/ExploreGameController.java +++ b/src/main/java/org/idatt2003/controller/ExploreGameController.java @@ -1,4 +1,4 @@ -package org.example.chaosgame.controller; +package org.idatt2003.controller; import java.util.ArrayList; import java.util.List; @@ -7,17 +7,17 @@ import javafx.scene.input.MouseEvent; import javafx.scene.input.ScrollEvent; import javafx.scene.layout.StackPane; import javafx.scene.paint.Color; -import org.example.chaosgame.controller.interfaces.GameController; -import org.example.chaosgame.controller.interfaces.Observer; -import org.example.chaosgame.controller.interfaces.Subject; -import org.example.chaosgame.model.chaos.ChaosCanvas; -import org.example.chaosgame.model.chaos.ChaosGameDescription; -import org.example.chaosgame.model.chaos.ExploreGame; -import org.example.chaosgame.model.linalg.Complex; -import org.example.chaosgame.model.linalg.Vector2D; -import org.example.chaosgame.model.transformations.ExploreJulia; -import org.example.chaosgame.model.transformations.Transform2D; -import org.example.chaosgame.view.ExplorePage; +import org.idatt2003.controller.interfaces.GameController; +import org.idatt2003.controller.interfaces.Observer; +import org.idatt2003.controller.interfaces.Subject; +import org.idatt2003.model.chaos.ChaosCanvas; +import org.idatt2003.model.chaos.ChaosGameDescription; +import org.idatt2003.model.chaos.ExploreGame; +import org.idatt2003.model.linalg.Complex; +import org.idatt2003.model.linalg.Vector2D; +import org.idatt2003.model.transformations.ExploreJulia; +import org.idatt2003.model.transformations.Transform2D; +import org.idatt2003.view.ExplorePage; /** * Controller class for the ExploreGame. @@ -26,7 +26,8 @@ import org.example.chaosgame.view.ExplorePage; * * <p>The controller implements the GameController, and is a Subject and Observer. */ -public class ExploreGameController implements Observer, Subject, GameController { +public class ExploreGameController extends CanvasPainter + implements Observer, Subject, GameController { private ExploreGame exploreGame; private final ExplorePage explorePage; private ChaosCanvas chaosCanvas; @@ -46,6 +47,8 @@ public class ExploreGameController implements Observer, Subject, GameController /** * Constructor for ExploreGameController. * Initializes the ExploreGame and ExplorePage. + * It registers itself as an observer of the ExploreGame. + * */ public ExploreGameController() { ExploreJulia exploreJulia = new ExploreJulia(new Complex(-0.835, 0.2321)); @@ -58,6 +61,7 @@ public class ExploreGameController implements Observer, Subject, GameController this.pageObservers = new ArrayList<>(); exploreGame.registerObserver(this); this.explorePage = new ExplorePage(this); + } public void setCanvas(Canvas canvas) { @@ -79,7 +83,9 @@ public class ExploreGameController implements Observer, Subject, GameController /** * Method for handling mouse dragged events. - * Moves the canvas based on the distance dragged. + * Moves the canvas based on the distance dragged, + * by translating in the canvas in the x- and y-direction. + * Updates the drag start position. * * @param event MouseEvent */ @@ -132,6 +138,14 @@ public class ExploreGameController implements Observer, Subject, GameController /** * Method for handling scroll events. * Zooms in or out based on the scroll direction. + * Prevents zooming out too far by setting a zoom in/out limit + * and saving the cumulative scale factor. + * Allows for faster zooming when holding down the control key. + * + * <p>Inspired by: + * <a href="https://github.com/majidrouhani/idatt2003-gui-demo-mandelbrot"> + * idatt2003-gui-demo-mandelbrot</a> + * * * @param event ScrollEvent */ @@ -172,9 +186,16 @@ public class ExploreGameController implements Observer, Subject, GameController maxCoords = canvasCenter.add(description.getMaxCoords() .subtract(canvasCenter).scale(scaleFactor)); updateExplorePage(); + event.consume(); } + /** + * Method for updating the ExplorePage. + * Updates the ExplorePage with the new ExploreGame. + * Updates the canvas with the new fractal. + * Resets the canvas position and scale. + */ private void updateExplorePage() { this.description.setMinCoords(minCoords); this.description.setMaxCoords(maxCoords); @@ -184,15 +205,17 @@ public class ExploreGameController implements Observer, Subject, GameController this.exploreGame.registerObserver(this); this.chaosCanvas = exploreGame.getCanvas(); exploreGame.exploreFractals(); - explorePage.updateCanvas(exploreGame.getCanvas()); - this.canvas.setTranslateX(0); this.canvas.setTranslateY(0); this.canvas.setScaleX(1); this.canvas.setScaleY(1); } - + /** + * Method for handling home button clicks. + * Notifies observers. + */ + @Override public void homeButtonClicked() { notifyObservers(); } @@ -208,8 +231,8 @@ public class ExploreGameController implements Observer, Subject, GameController */ @Override public void updateFractalColor(Color color) { - explorePage.setFractalColor(color); - explorePage.updateCanvas(exploreGame.getCanvas()); + setFractalColor(color); + updateCanvas(chaosCanvas, canvas.getGraphicsContext2D()); } /** @@ -227,6 +250,14 @@ public class ExploreGameController implements Observer, Subject, GameController updateExplorePage(); } + + /** + * Method for binding the canvas to the main pane. + * Binds the canvas width and height to the main pane width and height. + * Updates the canvas width and height when the main pane width and height changes with listeners. + * + * @param mainPane Main pane of the application + */ @Override public void setBind(StackPane mainPane) { canvas.widthProperty().bind(mainPane.widthProperty().multiply(0.85)); @@ -245,6 +276,12 @@ public class ExploreGameController implements Observer, Subject, GameController }); } + /** + * Method for updating the Julia value. + * + * @param partType Part type + * @param value New value + */ @Override public void updateJuliaValue(String partType, double value) { ExploreJulia exploreTransform = @@ -264,14 +301,14 @@ public class ExploreGameController implements Observer, Subject, GameController */ @Override public void update() { - explorePage.updateCanvas(exploreGame.getCanvas()); + updateCanvas(chaosCanvas, canvas.getGraphicsContext2D()); explorePage.updateInformation( description.getTransforms().getFirst(), description.getMinCoords(), description.getMaxCoords()); } /** - * Method for registering an observer. + * Method for registering a page observer. * * @param observer Observer */ @@ -281,7 +318,7 @@ public class ExploreGameController implements Observer, Subject, GameController } /** - * Method for removing an observer. + * Method for removing a page observer. * * @param observer Observer */ @@ -291,7 +328,7 @@ public class ExploreGameController implements Observer, Subject, GameController } /** - * Method for notifying observers. + * Method for notifying page observers. */ @Override public void notifyObservers() { @@ -299,4 +336,6 @@ public class ExploreGameController implements Observer, Subject, GameController pageObserver.update(); } } + + } diff --git a/src/main/java/org/example/chaosgame/controller/HomeController.java b/src/main/java/org/idatt2003/controller/HomeController.java similarity index 83% rename from src/main/java/org/example/chaosgame/controller/HomeController.java rename to src/main/java/org/idatt2003/controller/HomeController.java index 8695475a5698cb6c6eb0f06d34b94fe70cb37ad8..161f2853f0d0b9e62aed6ccbb6c5e3818c50ba56 100644 --- a/src/main/java/org/example/chaosgame/controller/HomeController.java +++ b/src/main/java/org/idatt2003/controller/HomeController.java @@ -1,4 +1,4 @@ -package org.example.chaosgame.controller; +package org.idatt2003.controller; import javafx.event.EventType; import javafx.scene.effect.ColorAdjust; @@ -7,7 +7,7 @@ import javafx.scene.media.MediaPlayer; import javafx.scene.media.MediaView; import javafx.scene.text.Text; import javafx.util.Duration; -import org.example.chaosgame.view.HomePage; +import org.idatt2003.view.HomePage; /** * Controller for the home page. @@ -30,7 +30,9 @@ public class HomeController { } /** - * Handles mouse events for the home page. + * Handles MOUSE_ENTERED or MOUSE_EXITED events + * for the home page. Either plays or pauses video and adds + * opacity to the text and color adjusts the MediaView. * * @param mouseEvent the mouse event * @param video the video @@ -46,7 +48,7 @@ public class HomeController { view.setEffect(colorAdjust); header.setEffect(headerAdjust); header.setOpacity(0.2); - } else { + } else if (mouseEvent == MouseEvent.MOUSE_EXITED) { video.seek(Duration.seconds(0)); video.pause(); view.setEffect(colorAdjust); diff --git a/src/main/java/org/example/chaosgame/controller/PageController.java b/src/main/java/org/idatt2003/controller/PageController.java similarity index 95% rename from src/main/java/org/example/chaosgame/controller/PageController.java rename to src/main/java/org/idatt2003/controller/PageController.java index e8883f59932f90e390439bb4d34d2c6be884f8c1..03ddb8f23599985434fe2798070f95c01d22c632 100644 --- a/src/main/java/org/example/chaosgame/controller/PageController.java +++ b/src/main/java/org/idatt2003/controller/PageController.java @@ -1,11 +1,11 @@ -package org.example.chaosgame.controller; +package org.idatt2003.controller; import java.util.HashMap; import java.util.Map; import javafx.scene.Node; import javafx.scene.layout.StackPane; -import org.example.chaosgame.controller.interfaces.Observer; -import org.example.chaosgame.view.HomePage; +import org.idatt2003.controller.interfaces.Observer; +import org.idatt2003.view.HomePage; /** * Controller for the different pages in the application. diff --git a/src/main/java/org/example/chaosgame/controller/interfaces/GameController.java b/src/main/java/org/idatt2003/controller/interfaces/GameController.java similarity index 79% rename from src/main/java/org/example/chaosgame/controller/interfaces/GameController.java rename to src/main/java/org/idatt2003/controller/interfaces/GameController.java index 7c29ebd4be12149da3dad240806c1eecbf30ff48..61d5ea9f363f32679567dc1ce8698b8ce3c74ba5 100644 --- a/src/main/java/org/example/chaosgame/controller/interfaces/GameController.java +++ b/src/main/java/org/idatt2003/controller/interfaces/GameController.java @@ -1,11 +1,13 @@ -package org.example.chaosgame.controller.interfaces; +package org.idatt2003.controller.interfaces; import javafx.scene.layout.StackPane; import javafx.scene.paint.Color; -import org.example.chaosgame.view.GamePage; +import org.idatt2003.view.GamePage; /** * Interface for the GameController. + * Includes abstract methods for setting canvas bind, + * updating julia values, home button clicked and updating fractal colors */ public interface GameController { diff --git a/src/main/java/org/example/chaosgame/controller/interfaces/Observer.java b/src/main/java/org/idatt2003/controller/interfaces/Observer.java similarity index 66% rename from src/main/java/org/example/chaosgame/controller/interfaces/Observer.java rename to src/main/java/org/idatt2003/controller/interfaces/Observer.java index e20769649faa155b914b79bee914a6f32543018e..72c2e090459e45da893434521fe591949e664a3e 100644 --- a/src/main/java/org/example/chaosgame/controller/interfaces/Observer.java +++ b/src/main/java/org/idatt2003/controller/interfaces/Observer.java @@ -1,4 +1,4 @@ -package org.example.chaosgame.controller.interfaces; +package org.idatt2003.controller.interfaces; /** * Observer interface for the observer pattern. diff --git a/src/main/java/org/example/chaosgame/controller/interfaces/Subject.java b/src/main/java/org/idatt2003/controller/interfaces/Subject.java similarity index 78% rename from src/main/java/org/example/chaosgame/controller/interfaces/Subject.java rename to src/main/java/org/idatt2003/controller/interfaces/Subject.java index 9c0605d4fb3e3c1a5a36c6f925b9ab060be5e63b..ef59e5b961e0e658deb1784f5965c382015a0370 100644 --- a/src/main/java/org/example/chaosgame/controller/interfaces/Subject.java +++ b/src/main/java/org/idatt2003/controller/interfaces/Subject.java @@ -1,4 +1,4 @@ -package org.example.chaosgame.controller.interfaces; +package org.idatt2003.controller.interfaces; /** * Subject interface for the observer pattern. diff --git a/src/main/java/org/example/chaosgame/model/chaos/ChaosCanvas.java b/src/main/java/org/idatt2003/model/chaos/ChaosCanvas.java similarity index 96% rename from src/main/java/org/example/chaosgame/model/chaos/ChaosCanvas.java rename to src/main/java/org/idatt2003/model/chaos/ChaosCanvas.java index ed700b4911756bd4d62d8706bedc52679807e21e..1f9ab6f1a8a9b08cddd31ed3d1f4f749a13a67b0 100644 --- a/src/main/java/org/example/chaosgame/model/chaos/ChaosCanvas.java +++ b/src/main/java/org/idatt2003/model/chaos/ChaosCanvas.java @@ -1,8 +1,8 @@ -package org.example.chaosgame.model.chaos; +package org.idatt2003.model.chaos; -import org.example.chaosgame.model.linalg.Matrix2x2; -import org.example.chaosgame.model.linalg.Vector2D; -import org.example.chaosgame.model.transformations.AffineTransform2D; +import org.idatt2003.model.linalg.Matrix2x2; +import org.idatt2003.model.linalg.Vector2D; +import org.idatt2003.model.transformations.AffineTransform2D; /** * A class representing a canvas for the chaos game. diff --git a/src/main/java/org/example/chaosgame/model/chaos/ChaosGame.java b/src/main/java/org/idatt2003/model/chaos/ChaosGame.java similarity index 91% rename from src/main/java/org/example/chaosgame/model/chaos/ChaosGame.java rename to src/main/java/org/idatt2003/model/chaos/ChaosGame.java index 6ee43e34f845e10696777fb0da4fe27442048edc..a0afed447e773ee300a48643634139808210edea 100644 --- a/src/main/java/org/example/chaosgame/model/chaos/ChaosGame.java +++ b/src/main/java/org/idatt2003/model/chaos/ChaosGame.java @@ -1,11 +1,11 @@ -package org.example.chaosgame.model.chaos; +package org.idatt2003.model.chaos; import java.util.ArrayList; import java.util.List; import java.util.Random; -import org.example.chaosgame.controller.interfaces.Observer; -import org.example.chaosgame.controller.interfaces.Subject; -import org.example.chaosgame.model.linalg.Vector2D; +import org.idatt2003.controller.interfaces.Observer; +import org.idatt2003.controller.interfaces.Subject; +import org.idatt2003.model.linalg.Vector2D; /** * Class for running a chaos game. @@ -101,6 +101,8 @@ public class ChaosGame implements Subject { /** * Method for setting the chaos game description. + * Sets the description, resets the total steps, + * sets the chaosCanvas and * * @param newDescription New description of the chaos game * @throws IllegalArgumentException If newDescription is null @@ -164,8 +166,11 @@ public class ChaosGame implements Subject { /** * Method for running the chaos game. Randomly selects a transformation * from the description and applies it to the current point. + * + * @param steps Number of steps to run */ private void runStepsUniform(int steps) { + currentPoint = new Vector2D(0.0, 0.0); for (int i = 0; i < steps; i++) { int transformIndex = random.nextInt(description.getTransforms().size()); currentPoint = description.getTransforms().get(transformIndex).transform(currentPoint); @@ -177,11 +182,13 @@ public class ChaosGame implements Subject { * Method for running the chaos game with probabilities. * Randomly selects a transformation from the description based on the probabilities * and applies it to the current point. + * GitHub Copilot helped generate code logic. * * @param steps Number of steps to run * @param probabilities List of probabilities for the transformations */ private void runStepsWithProbabilities(int steps, List<Integer> probabilities) { + currentPoint = new Vector2D(0.0, 0.0); for (int i = 0; i < steps; i++) { int test = random.nextInt(100); int transformIndex = -1; @@ -201,7 +208,7 @@ public class ChaosGame implements Subject { } /** - * Method for registering an observer. + * Method for registering a game observer. * * @param gameObserver Observer to register */ @@ -211,7 +218,7 @@ public class ChaosGame implements Subject { } /** - * Method for removing an observer. + * Method for removing a game observer. * * @param gameObserver Observer to remove */ @@ -221,7 +228,8 @@ public class ChaosGame implements Subject { } /** - * Method for notifying observers. + * Method for notifying observers of the game. + * */ @Override public void notifyObservers() { diff --git a/src/main/java/org/example/chaosgame/model/chaos/ChaosGameDescription.java b/src/main/java/org/idatt2003/model/chaos/ChaosGameDescription.java similarity index 79% rename from src/main/java/org/example/chaosgame/model/chaos/ChaosGameDescription.java rename to src/main/java/org/idatt2003/model/chaos/ChaosGameDescription.java index 8c7177f940833f147f256ae1eea7b859cd1983a2..a724ef983910220c10742e285083afb3d667c695 100644 --- a/src/main/java/org/example/chaosgame/model/chaos/ChaosGameDescription.java +++ b/src/main/java/org/idatt2003/model/chaos/ChaosGameDescription.java @@ -1,9 +1,9 @@ -package org.example.chaosgame.model.chaos; +package org.idatt2003.model.chaos; import java.util.List; import java.util.Objects; -import org.example.chaosgame.model.linalg.Vector2D; -import org.example.chaosgame.model.transformations.Transform2D; +import org.idatt2003.model.linalg.Vector2D; +import org.idatt2003.model.transformations.Transform2D; /** @@ -20,6 +20,7 @@ public class ChaosGameDescription { /** * Constructor for ChaosGameDescription. + * Validates the coordinates and transformations. * * @param minCoords Minimum coordinates of the game area * @@ -53,7 +54,7 @@ public class ChaosGameDescription { throws IllegalArgumentException { validateCoordinates(minCoords, maxCoords); validateTransforms(transforms); - if (probabilities.size() != transforms.size()) { + if (probabilities != null && probabilities.size() != transforms.size()) { throw new IllegalArgumentException("Probabilities must match the number of transformations"); } this.minCoords = minCoords; @@ -68,8 +69,11 @@ public class ChaosGameDescription { * @param minCoords Minimum coordinates of the game area * * @param maxCoords Maximum coordinates of the game area + * + * @throws IllegalArgumentException if transformation is null or has more elements than 4 */ - private void validateCoordinates(Vector2D minCoords, Vector2D maxCoords) { + private void validateCoordinates(Vector2D minCoords, Vector2D maxCoords) + throws IllegalArgumentException { if (minCoords.getX() < -50 || minCoords.getY() < -50 || minCoords.getX() > 50 || minCoords.getY() > 50 || maxCoords.getX() > 50 || maxCoords.getY() > 50 @@ -84,20 +88,6 @@ public class ChaosGameDescription { } } - /** - * Method for validating the transformations. - * - * @param transforms List of transformations to apply to the points - */ - private void validateTransforms(List<Transform2D> transforms) { - if (transforms == null) { - throw new IllegalArgumentException("Transformations cannot be null"); - } - if (transforms.size() > 4 || transforms.isEmpty()) { - throw new IllegalArgumentException("Number of transformations must be between 1 and 4"); - } - } - public Vector2D getMinCoords() { return minCoords; } @@ -114,15 +104,49 @@ public class ChaosGameDescription { return probabilities; } + /** + * Method for validating the transformations. + * + * @param transforms List of transformations to apply to the points + * + * @throws IllegalArgumentException if transformation is null, empty or has more elements than 4 + */ + private void validateTransforms(List<Transform2D> transforms) throws IllegalArgumentException { + if (transforms == null) { + throw new IllegalArgumentException("Transformations cannot be null"); + } + if (transforms.size() > 4 || transforms.isEmpty()) { + throw new IllegalArgumentException("Number of transformations must be between 1 and 4"); + } + } + + /** + * Method for setting the description transformations. + * Validates first then, sets the transformations. + * + * @param transforms List of transformations to set + */ public void setTransforms(List<Transform2D> transforms) { validateTransforms(transforms); this.transforms = transforms; } + /** + * Method for setting the descriptions min coordinates + * Does not validate because of the drag and drop functionality in Explore Game. + * + * @param minCoords new min coordinates + */ public void setMinCoords(Vector2D minCoords) { this.minCoords = minCoords; } + /** + * Method for setting the description max coordinates. + * Does not validate because of the drag and drop functionality in Explore Game. + * + * @param maxCoords new max coordinates + */ public void setMaxCoords(Vector2D maxCoords) { this.maxCoords = maxCoords; } diff --git a/src/main/java/org/example/chaosgame/model/chaos/ChaosGameType.java b/src/main/java/org/idatt2003/model/chaos/ChaosGameType.java similarity index 80% rename from src/main/java/org/example/chaosgame/model/chaos/ChaosGameType.java rename to src/main/java/org/idatt2003/model/chaos/ChaosGameType.java index c709d9a32442da82d4072798fa91534f09e90d01..e0ca41e8d4455a7d021202d41c899ec1070e1680 100644 --- a/src/main/java/org/example/chaosgame/model/chaos/ChaosGameType.java +++ b/src/main/java/org/idatt2003/model/chaos/ChaosGameType.java @@ -1,4 +1,4 @@ -package org.example.chaosgame.model.chaos; +package org.idatt2003.model.chaos; /** * Enum for the different types of chaos games. diff --git a/src/main/java/org/example/chaosgame/model/chaos/ExploreGame.java b/src/main/java/org/idatt2003/model/chaos/ExploreGame.java similarity index 70% rename from src/main/java/org/example/chaosgame/model/chaos/ExploreGame.java rename to src/main/java/org/idatt2003/model/chaos/ExploreGame.java index 16aa2be8aad9ec1f1d27b468fd3e858ae91be351..7d95e42d245f09771167d83682de6c8720865e65 100644 --- a/src/main/java/org/example/chaosgame/model/chaos/ExploreGame.java +++ b/src/main/java/org/idatt2003/model/chaos/ExploreGame.java @@ -1,26 +1,31 @@ -package org.example.chaosgame.model.chaos; +package org.idatt2003.model.chaos; import java.util.ArrayList; import java.util.List; import java.util.stream.IntStream; -import org.example.chaosgame.controller.interfaces.Observer; -import org.example.chaosgame.controller.interfaces.Subject; -import org.example.chaosgame.model.linalg.Vector2D; - +import org.idatt2003.controller.interfaces.Observer; +import org.idatt2003.controller.interfaces.Subject; +import org.idatt2003.model.linalg.Vector2D; /** - * Class for exploring julia sets. + * Class for exploring fractal sets. + * Currently, it is only set to calculate julia fractals, + * can be expanded to work with other fractals. */ public class ExploreGame implements Subject { private static final int MAX_ITER = 256; - private final ChaosCanvas canvas; + private ChaosCanvas canvas; private ChaosGameDescription description; private Vector2D currentPoint = new Vector2D(0.0, 0.0); private final List<Observer> gameObservers; /** * Constructor for ExploreGame. + * Creates a new ExploreGame object with the + * given description, width, and height. + * Creates a new ChaosCanvas object with the + * minCoords and maxCoords in the ChaosGameDescription. * * @param description Description of the chaos game * @@ -42,13 +47,12 @@ public class ExploreGame implements Subject { * * @param description Description of the chaos game * - * @param width Width of the canvas - * - * @param height Height of the canvas + * @param canvas ChaosCanvas object */ - public void setExploreGame(ChaosGameDescription description, int width, int height) { + public void setExploreGame(ChaosGameDescription description, ChaosCanvas canvas) { this.description = description; - setChaosCanvas(description.getMinCoords(), description.getMaxCoords(), width, height); + this.canvas = canvas; + this.currentPoint = new Vector2D(0.0, 0.0); } @@ -60,30 +64,14 @@ public class ExploreGame implements Subject { return description; } - /** - * Method for setting the chaos canvas. - * - * @param minCoords Minimum coordinates of the canvas - * - * @param maxCoords Maximum coordinates of the canvas - * - * @param width Width of the canvas - * - * @param height Height of the canvas - */ - public void setChaosCanvas(Vector2D minCoords, Vector2D maxCoords, int width, int height) { - this.canvas.clearCanvas(); - this.canvas.setMaxCoords(maxCoords); - this.canvas.setMinCoords(minCoords); - this.canvas.setWidth(width); - this.canvas.setHeight(height); - } /** * Method for exploring fractals. Iterates over all pixels in the canvas * and applies the transformation to the current point. * Inspiration from <a href="https://www.youtube.com/watch?v=uc2yok_pLV4">Pezzza's Work</a> - * and <a href="https://github.com/majidrouhani/idatt2003-gui-demo-mandelbrot">idatt2003-gui-demo-mandelbrot</a> + * for the smoothing algorithm. + * And also <a href="https://github.com/majidrouhani/idatt2003-gui-demo-mandelbrot">idatt2003-gui-demo-mandelbrot</a> + * for the parallel stream. * */ public void exploreFractals() { diff --git a/src/main/java/org/example/chaosgame/model/linalg/Complex.java b/src/main/java/org/idatt2003/model/linalg/Complex.java similarity index 67% rename from src/main/java/org/example/chaosgame/model/linalg/Complex.java rename to src/main/java/org/idatt2003/model/linalg/Complex.java index 8e671f699155addb30a3003d54272274c3124352..9db6200211c651f6596f223315ad19d9a1b2fe64 100644 --- a/src/main/java/org/example/chaosgame/model/linalg/Complex.java +++ b/src/main/java/org/idatt2003/model/linalg/Complex.java @@ -1,4 +1,4 @@ -package org.example.chaosgame.model.linalg; +package org.idatt2003.model.linalg; import java.util.Random; @@ -12,7 +12,7 @@ public class Complex extends Vector2D { /** * Constructor for Complex class. - * super(x, y) is used to call the constructor of the superclass, Vector2D. + * Method super(x, y) is used to call the constructor of the superclass, Vector2D. * * @param real x-coordinate. * @param imaginary y-coordinate. @@ -23,10 +23,21 @@ public class Complex extends Vector2D { /** * Method to calculate the square root of a complex number. + * This formula describes the transformation: + * <br> + * <span style="font-family: Courier"> + * z → ±√̅(̅a̅ ̅+̅ + * ̅b̅i̅) </span> + * where: + * <ul> + * <li>a is the real part of the complex number</li> + * <li>b is the imaginary part of the complex number</li> + * <li>i is the imaginary unit</li> + * </ul> * * @param realPart the real part of the complex number. * @param imaginaryPart the imaginary part of the complex number. - * @return a new complex number that is the square root of the input cRe and cIm. + * @return a new complex number that is the square root of the input realPart and imaginaryPart. */ public Complex sqrt(double realPart, double imaginaryPart) { double a = Math.pow(realPart, 2) + Math.pow(imaginaryPart, 2); diff --git a/src/main/java/org/example/chaosgame/model/linalg/Matrix2x2.java b/src/main/java/org/idatt2003/model/linalg/Matrix2x2.java similarity index 89% rename from src/main/java/org/example/chaosgame/model/linalg/Matrix2x2.java rename to src/main/java/org/idatt2003/model/linalg/Matrix2x2.java index ea2b4911ee21761c87b45e26ff255d7333db036e..9dd41a29c796aade5d45a797a7c4117796835fc2 100644 --- a/src/main/java/org/example/chaosgame/model/linalg/Matrix2x2.java +++ b/src/main/java/org/idatt2003/model/linalg/Matrix2x2.java @@ -1,4 +1,4 @@ -package org.example.chaosgame.model.linalg; +package org.idatt2003.model.linalg; import java.util.Objects; @@ -29,6 +29,9 @@ public record Matrix2x2(double a, double b, double c, double d) { /** * Method to multiply a 2x2 matrix with a 2D vector. + * Multiplies the matrix x-values with the vector x-values and the matrix + * y-values with the vector y-values. + * Method add the results together to get a new vector with new x and y values. * * @param vector the vector to multiply with. * @return a new 2D vector. diff --git a/src/main/java/org/example/chaosgame/model/linalg/Vector2D.java b/src/main/java/org/idatt2003/model/linalg/Vector2D.java similarity index 75% rename from src/main/java/org/example/chaosgame/model/linalg/Vector2D.java rename to src/main/java/org/idatt2003/model/linalg/Vector2D.java index c06683ae4e49f58196a970b7dfae59891df163d5..2a9061e601b6781cb847eb5b00283b67959de567 100644 --- a/src/main/java/org/example/chaosgame/model/linalg/Vector2D.java +++ b/src/main/java/org/idatt2003/model/linalg/Vector2D.java @@ -1,4 +1,4 @@ -package org.example.chaosgame.model.linalg; +package org.idatt2003.model.linalg; import java.util.Objects; @@ -15,6 +15,7 @@ public class Vector2D { /** * Constructor for Vector2D. + * Creates a new 2D vector with the given x and y coordinates. * * @param x x-coordinate * @param y y-coordinate @@ -34,6 +35,8 @@ public class Vector2D { /** * Add two vectors together. + * The sum of two vectors is a new vector with + * the sum of the x-coordinates and the sum of the y-coordinates. * * @param other the other vector * @return the sum of the two vectors @@ -46,6 +49,8 @@ public class Vector2D { /** * Subtract one vector from another. + * The difference of two vectors is a new vector with + * the difference of the x-coordinates and the difference of the y-coordinates. * * @param other the other vector * @return the difference of the two vectors @@ -58,6 +63,8 @@ public class Vector2D { /** * Scale a vector by a scalar. + * The scaled vector is a new vector with the + * x and y coordinates multiplied by the scalar. * * @param scalar the scalar to multiply the vector by * @return the scaled vector @@ -70,6 +77,8 @@ public class Vector2D { /** * Multiply two vectors together. + * The product of two vectors is a new vector with + * the product of the x-coordinates and the product of the y-coordinates. * * @param other the other vector * @return the product of the two vectors @@ -82,6 +91,8 @@ public class Vector2D { /** * Divide one vector by another. + * The quotient of two vectors is a new vector with + * the quotient of the x-coordinates and the quotient of the y-coordinates. * * @param other the other vector * @return the quotient of the two vectors @@ -93,9 +104,11 @@ public class Vector2D { } /** - * Calculate the length of a vector. + * Calculate the squared length of a vector. + * The squared magnitude of a vector is the sum + * of the squares of the x and y coordinates. * - * @return the length of the vector + * @return the squared length of the vector */ public double lengthSq() { return x * x + y * y; diff --git a/src/main/java/org/example/chaosgame/model/transformations/AffineTransform2D.java b/src/main/java/org/idatt2003/model/transformations/AffineTransform2D.java similarity index 92% rename from src/main/java/org/example/chaosgame/model/transformations/AffineTransform2D.java rename to src/main/java/org/idatt2003/model/transformations/AffineTransform2D.java index da0db148c4a0ca696002e500fa59eec2bb692800..b6643cf52463fb409c298c5638e1bcac8689a553 100644 --- a/src/main/java/org/example/chaosgame/model/transformations/AffineTransform2D.java +++ b/src/main/java/org/idatt2003/model/transformations/AffineTransform2D.java @@ -1,8 +1,8 @@ -package org.example.chaosgame.model.transformations; +package org.idatt2003.model.transformations; import java.util.Objects; -import org.example.chaosgame.model.linalg.Matrix2x2; -import org.example.chaosgame.model.linalg.Vector2D; +import org.idatt2003.model.linalg.Matrix2x2; +import org.idatt2003.model.linalg.Vector2D; /** diff --git a/src/main/java/org/example/chaosgame/model/transformations/ExploreJulia.java b/src/main/java/org/idatt2003/model/transformations/ExploreJulia.java similarity index 87% rename from src/main/java/org/example/chaosgame/model/transformations/ExploreJulia.java rename to src/main/java/org/idatt2003/model/transformations/ExploreJulia.java index 4d84a62e2352e3f4079d95b9a97105ccf2c57818..373b540c4b5a4d94ab1fa0465cb885a42a390f86 100644 --- a/src/main/java/org/example/chaosgame/model/transformations/ExploreJulia.java +++ b/src/main/java/org/idatt2003/model/transformations/ExploreJulia.java @@ -1,7 +1,7 @@ -package org.example.chaosgame.model.transformations; +package org.idatt2003.model.transformations; -import org.example.chaosgame.model.linalg.Complex; -import org.example.chaosgame.model.linalg.Vector2D; +import org.idatt2003.model.linalg.Complex; +import org.idatt2003.model.linalg.Vector2D; /** * Class for the Julia transformation. diff --git a/src/main/java/org/example/chaosgame/model/transformations/JuliaTransform.java b/src/main/java/org/idatt2003/model/transformations/JuliaTransform.java similarity index 88% rename from src/main/java/org/example/chaosgame/model/transformations/JuliaTransform.java rename to src/main/java/org/idatt2003/model/transformations/JuliaTransform.java index 98119ed4144a9a0758c78c3b20e5ec157244db11..c3f5eec1fe94090304ab5f61f5f1eb98555f6f67 100644 --- a/src/main/java/org/example/chaosgame/model/transformations/JuliaTransform.java +++ b/src/main/java/org/idatt2003/model/transformations/JuliaTransform.java @@ -1,8 +1,8 @@ -package org.example.chaosgame.model.transformations; +package org.idatt2003.model.transformations; import java.util.Objects; -import org.example.chaosgame.model.linalg.Complex; -import org.example.chaosgame.model.linalg.Vector2D; +import org.idatt2003.model.linalg.Complex; +import org.idatt2003.model.linalg.Vector2D; /** * Class for the Julia transformation. @@ -18,6 +18,7 @@ public class JuliaTransform implements Transform2D { /** * Constructor for JuliaTransform. + * Creates a new JuliaTransform object with the given complex number and sign. * * @param point the complex number c * @param sign the sign of the transformation @@ -32,6 +33,7 @@ public class JuliaTransform implements Transform2D { } /** + * JuliaTransform implementation of the transform method in Transform2D. * Method to transform a 2D vector using the Julia transformation. * This formula describes the transformation: * <br> diff --git a/src/main/java/org/idatt2003/model/transformations/Transform2D.java b/src/main/java/org/idatt2003/model/transformations/Transform2D.java new file mode 100644 index 0000000000000000000000000000000000000000..592258d21dbb53631becc7929be281f0c721f3c9 --- /dev/null +++ b/src/main/java/org/idatt2003/model/transformations/Transform2D.java @@ -0,0 +1,11 @@ +package org.idatt2003.model.transformations; + +import org.idatt2003.model.linalg.Vector2D; + +/** + * Interface for 2D transformations. + * Implementing classes should transform a 2D point. + */ +public interface Transform2D { + Vector2D transform(Vector2D point); +} diff --git a/src/main/java/org/example/chaosgame/view/ChaosPage.java b/src/main/java/org/idatt2003/view/ChaosPage.java similarity index 80% rename from src/main/java/org/example/chaosgame/view/ChaosPage.java rename to src/main/java/org/idatt2003/view/ChaosPage.java index 5ada76ba90ee8975e1c18c1baf38e51e97a7e8a4..f9487e2e1951699a45031b4636adbb95da484d75 100644 --- a/src/main/java/org/example/chaosgame/view/ChaosPage.java +++ b/src/main/java/org/idatt2003/view/ChaosPage.java @@ -1,12 +1,12 @@ -package org.example.chaosgame.view; +package org.idatt2003.view; import javafx.scene.canvas.GraphicsContext; -import org.example.chaosgame.controller.ChaosGameController; -import org.example.chaosgame.model.linalg.Vector2D; -import org.example.chaosgame.model.transformations.Transform2D; -import org.example.chaosgame.view.components.BottomBar; -import org.example.chaosgame.view.components.SideBar; -import org.example.chaosgame.view.components.TopBar; +import org.idatt2003.controller.ChaosGameController; +import org.idatt2003.model.linalg.Vector2D; +import org.idatt2003.model.transformations.Transform2D; +import org.idatt2003.view.components.BottomBar; +import org.idatt2003.view.components.SideBar; +import org.idatt2003.view.components.TopBar; /** * Class for the ChaosPage, extends GamePage. diff --git a/src/main/java/org/example/chaosgame/view/ExplorePage.java b/src/main/java/org/idatt2003/view/ExplorePage.java similarity index 82% rename from src/main/java/org/example/chaosgame/view/ExplorePage.java rename to src/main/java/org/idatt2003/view/ExplorePage.java index 610dce2870d3932bea90c088c3a446789c10a1ca..b9058362dc63fa058403232a3eec684ebeacd976 100644 --- a/src/main/java/org/example/chaosgame/view/ExplorePage.java +++ b/src/main/java/org/idatt2003/view/ExplorePage.java @@ -1,11 +1,11 @@ -package org.example.chaosgame.view; +package org.idatt2003.view; -import org.example.chaosgame.controller.ExploreGameController; -import org.example.chaosgame.model.linalg.Vector2D; -import org.example.chaosgame.model.transformations.Transform2D; -import org.example.chaosgame.view.components.BottomBar; -import org.example.chaosgame.view.components.SideBar; -import org.example.chaosgame.view.components.TopBar; +import org.idatt2003.controller.ExploreGameController; +import org.idatt2003.model.linalg.Vector2D; +import org.idatt2003.model.transformations.Transform2D; +import org.idatt2003.view.components.BottomBar; +import org.idatt2003.view.components.SideBar; +import org.idatt2003.view.components.TopBar; /** * Class for the ExplorePage, extends GamePage. diff --git a/src/main/java/org/idatt2003/view/GamePage.java b/src/main/java/org/idatt2003/view/GamePage.java new file mode 100644 index 0000000000000000000000000000000000000000..00c845e743826ff972b252e1cdeaa20969701036 --- /dev/null +++ b/src/main/java/org/idatt2003/view/GamePage.java @@ -0,0 +1,25 @@ +package org.idatt2003.view; + +import javafx.scene.canvas.Canvas; +import javafx.scene.canvas.GraphicsContext; +import javafx.scene.layout.BorderPane; + +/** + * Abstract class for the GamePage, extends BorderPane. + * The GamePage is used for displaying the game. + */ +public abstract class GamePage extends BorderPane { + private static final int CANVAS_WIDTH = 1250; + private static final int CANVAS_HEIGHT = 805; + protected final GraphicsContext gc; + + /** + * Constructor for the GamePage. + * Initializes the canvas and makes a new GraphicsContext + * available for subclasses. + */ + public GamePage() { + Canvas canvas = new Canvas(CANVAS_WIDTH, CANVAS_HEIGHT); + this.gc = canvas.getGraphicsContext2D(); + } +} diff --git a/src/main/java/org/example/chaosgame/view/HomePage.java b/src/main/java/org/idatt2003/view/HomePage.java similarity index 94% rename from src/main/java/org/example/chaosgame/view/HomePage.java rename to src/main/java/org/idatt2003/view/HomePage.java index 052d6c7ff0ece941c4382dff63a30a0c398ae52f..083cab1bfe9d47099806282b58063c9b162bc364 100644 --- a/src/main/java/org/example/chaosgame/view/HomePage.java +++ b/src/main/java/org/idatt2003/view/HomePage.java @@ -1,4 +1,4 @@ -package org.example.chaosgame.view; +package org.idatt2003.view; import java.util.Objects; import javafx.geometry.Pos; @@ -12,10 +12,10 @@ import javafx.scene.media.Media; import javafx.scene.media.MediaPlayer; import javafx.scene.media.MediaView; import javafx.scene.text.Text; -import org.example.chaosgame.controller.HomeController; -import org.example.chaosgame.controller.PageController; -import org.example.chaosgame.view.components.ExitButton; -import org.example.chaosgame.view.components.GameHeader; +import org.idatt2003.controller.HomeController; +import org.idatt2003.controller.PageController; +import org.idatt2003.view.components.ExitButton; +import org.idatt2003.view.components.GameHeader; /** * Class for the home page, extends StackPane. diff --git a/src/main/java/org/example/chaosgame/view/components/AlertUtility.java b/src/main/java/org/idatt2003/view/components/AlertUtility.java similarity index 91% rename from src/main/java/org/example/chaosgame/view/components/AlertUtility.java rename to src/main/java/org/idatt2003/view/components/AlertUtility.java index f0b2af5dea9aba7efd9b49e42504a59126062813..2faab9031ec9aef836b38c4cd8d45e9334294686 100644 --- a/src/main/java/org/example/chaosgame/view/components/AlertUtility.java +++ b/src/main/java/org/idatt2003/view/components/AlertUtility.java @@ -1,4 +1,4 @@ -package org.example.chaosgame.view.components; +package org.idatt2003.view.components; import javafx.scene.control.Alert; diff --git a/src/main/java/org/example/chaosgame/view/components/BaseSlider.java b/src/main/java/org/idatt2003/view/components/BaseSlider.java similarity index 88% rename from src/main/java/org/example/chaosgame/view/components/BaseSlider.java rename to src/main/java/org/idatt2003/view/components/BaseSlider.java index 6f21a499d228cdb4bf26a27b57e9fbde446fb943..7964c50c8bfb27ff7e128ffb7ad99eb05a3ce8d0 100644 --- a/src/main/java/org/example/chaosgame/view/components/BaseSlider.java +++ b/src/main/java/org/idatt2003/view/components/BaseSlider.java @@ -1,7 +1,7 @@ -package org.example.chaosgame.view.components; +package org.idatt2003.view.components; import javafx.scene.control.Slider; -import org.example.chaosgame.controller.interfaces.GameController; +import org.idatt2003.controller.interfaces.GameController; /** diff --git a/src/main/java/org/example/chaosgame/view/components/BottomBar.java b/src/main/java/org/idatt2003/view/components/BottomBar.java similarity index 82% rename from src/main/java/org/example/chaosgame/view/components/BottomBar.java rename to src/main/java/org/idatt2003/view/components/BottomBar.java index d0117d724f9b5fddba3930c8f23c6808ee85e8c6..1d3a222b18e2a4efc6ffd4856c7811b9eb0981c5 100644 --- a/src/main/java/org/example/chaosgame/view/components/BottomBar.java +++ b/src/main/java/org/idatt2003/view/components/BottomBar.java @@ -1,13 +1,13 @@ -package org.example.chaosgame.view.components; +package org.idatt2003.view.components; import javafx.geometry.Pos; import javafx.scene.control.Label; import javafx.scene.layout.HBox; -import org.example.chaosgame.controller.interfaces.GameController; -import org.example.chaosgame.model.linalg.Complex; -import org.example.chaosgame.model.transformations.ExploreJulia; -import org.example.chaosgame.model.transformations.JuliaTransform; -import org.example.chaosgame.model.transformations.Transform2D; +import org.idatt2003.controller.interfaces.GameController; +import org.idatt2003.model.linalg.Complex; +import org.idatt2003.model.transformations.ExploreJulia; +import org.idatt2003.model.transformations.JuliaTransform; +import org.idatt2003.model.transformations.Transform2D; /** @@ -70,8 +70,10 @@ public class BottomBar extends HBox { sliderInfoVisibility(true); sliderRealPart.setValue(complex.getX()); sliderImaginaryPart.setValue(complex.getY()); - realPartLabel.setText("Real Part: " + (double) Math.round(complex.getX() * 100) / 100); - imaginaryPartLabel.setText("Imaginary Part: " + (double) Math.round(complex.getY() * 100) / 100); + realPartLabel.setText("Real Part: " + + (double) Math.round(complex.getX() * 100) / 100); + imaginaryPartLabel.setText("Imaginary Part: " + + (double) Math.round(complex.getY() * 100) / 100); } /** diff --git a/src/main/java/org/example/chaosgame/view/components/ColorPickerComponent.java b/src/main/java/org/idatt2003/view/components/ColorPickerComponent.java similarity index 87% rename from src/main/java/org/example/chaosgame/view/components/ColorPickerComponent.java rename to src/main/java/org/idatt2003/view/components/ColorPickerComponent.java index 643fe4576a7d6385a76ca74c46f65a760337c6a4..c8f87896ce5396d7ac0ba452c57d7084128566b2 100644 --- a/src/main/java/org/example/chaosgame/view/components/ColorPickerComponent.java +++ b/src/main/java/org/idatt2003/view/components/ColorPickerComponent.java @@ -1,4 +1,4 @@ -package org.example.chaosgame.view.components; +package org.idatt2003.view.components; import java.util.function.Consumer; import javafx.scene.control.ColorPicker; @@ -18,6 +18,8 @@ public class ColorPickerComponent extends ColorPicker { this.getStyleClass().add("color-picker"); this.setMaxWidth(180); this.setMinWidth(180); + this.setMinHeight(40); + this.setMaxHeight(40); this.setOnAction(event -> colorChangeHandler.accept(this.getValue())); } } diff --git a/src/main/java/org/example/chaosgame/view/components/CreateAffinePane.java b/src/main/java/org/idatt2003/view/components/CreateAffinePane.java similarity index 98% rename from src/main/java/org/example/chaosgame/view/components/CreateAffinePane.java rename to src/main/java/org/idatt2003/view/components/CreateAffinePane.java index c8bdcdc9ab335c2ce0abfb8322b09a6134eec46b..9d097289e799f3910417375cb417ed3f169a44f7 100644 --- a/src/main/java/org/example/chaosgame/view/components/CreateAffinePane.java +++ b/src/main/java/org/idatt2003/view/components/CreateAffinePane.java @@ -1,4 +1,4 @@ -package org.example.chaosgame.view.components; +package org.idatt2003.view.components; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/org/example/chaosgame/view/components/CreateFractalDialog.java b/src/main/java/org/idatt2003/view/components/CreateFractalDialog.java similarity index 97% rename from src/main/java/org/example/chaosgame/view/components/CreateFractalDialog.java rename to src/main/java/org/idatt2003/view/components/CreateFractalDialog.java index 7ee80bf29e35cb1d486c24b56b7db6bb7a06a10d..c3d609e93dfb76cd09b1dfec3bd6522a92831265 100644 --- a/src/main/java/org/example/chaosgame/view/components/CreateFractalDialog.java +++ b/src/main/java/org/idatt2003/view/components/CreateFractalDialog.java @@ -1,4 +1,4 @@ -package org.example.chaosgame.view.components; +package org.idatt2003.view.components; import javafx.geometry.Insets; import javafx.scene.control.ButtonBar; diff --git a/src/main/java/org/example/chaosgame/view/components/CreateJuliaPane.java b/src/main/java/org/idatt2003/view/components/CreateJuliaPane.java similarity index 95% rename from src/main/java/org/example/chaosgame/view/components/CreateJuliaPane.java rename to src/main/java/org/idatt2003/view/components/CreateJuliaPane.java index ecbec347ece7e46b313405f9eb4e0b93810b2ebd..37335ade77a522014f5e4ebb177aff21b320d65b 100644 --- a/src/main/java/org/example/chaosgame/view/components/CreateJuliaPane.java +++ b/src/main/java/org/idatt2003/view/components/CreateJuliaPane.java @@ -1,4 +1,4 @@ -package org.example.chaosgame.view.components; +package org.idatt2003.view.components; import javafx.scene.control.TextField; import javafx.scene.layout.HBox; diff --git a/src/main/java/org/example/chaosgame/view/components/ExitButton.java b/src/main/java/org/idatt2003/view/components/ExitButton.java similarity index 82% rename from src/main/java/org/example/chaosgame/view/components/ExitButton.java rename to src/main/java/org/idatt2003/view/components/ExitButton.java index da97319bd86de1965b4987ab43f12b108a357ae1..f2dff273bcb2642d7f8ffcd067adc76edda679c1 100644 --- a/src/main/java/org/example/chaosgame/view/components/ExitButton.java +++ b/src/main/java/org/idatt2003/view/components/ExitButton.java @@ -1,4 +1,4 @@ -package org.example.chaosgame.view.components; +package org.idatt2003.view.components; import javafx.scene.control.Button; diff --git a/src/main/java/org/example/chaosgame/view/components/FractalSelectionBox.java b/src/main/java/org/idatt2003/view/components/FractalSelectionBox.java similarity index 79% rename from src/main/java/org/example/chaosgame/view/components/FractalSelectionBox.java rename to src/main/java/org/idatt2003/view/components/FractalSelectionBox.java index f4f8edc93d77d0b71b889d584d18113232bf6e70..827747031b9e52f0cafb6a2b29eddc253eaa0253 100644 --- a/src/main/java/org/example/chaosgame/view/components/FractalSelectionBox.java +++ b/src/main/java/org/idatt2003/view/components/FractalSelectionBox.java @@ -1,7 +1,7 @@ -package org.example.chaosgame.view.components; +package org.idatt2003.view.components; import javafx.scene.control.ComboBox; -import org.example.chaosgame.controller.ChaosGameController; +import org.idatt2003.controller.ChaosGameController; /** * Class for the FractalSelectionBox, extends ComboBox. @@ -17,7 +17,10 @@ public class FractalSelectionBox extends ComboBox<String> { * @param chaosGameController the controller for the chaos game */ public FractalSelectionBox(ChaosGameController chaosGameController) { - this.setPrefWidth(180); + this.setMaxWidth(180); + this.setMinWidth(180); + this.setMinHeight(40); + this.setMaxHeight(40); this.setPromptText("Julia "); this.getItems().addAll("Sierpinski", "Barnsley", "Julia"); diff --git a/src/main/java/org/example/chaosgame/view/components/GameButton.java b/src/main/java/org/idatt2003/view/components/GameButton.java similarity index 81% rename from src/main/java/org/example/chaosgame/view/components/GameButton.java rename to src/main/java/org/idatt2003/view/components/GameButton.java index 5f16d81db046dbd8e00d7120428a7f57c96d4ace..cc75f522fbbbbd345eec72c7d988ed6576224cb6 100644 --- a/src/main/java/org/example/chaosgame/view/components/GameButton.java +++ b/src/main/java/org/idatt2003/view/components/GameButton.java @@ -1,4 +1,4 @@ -package org.example.chaosgame.view.components; +package org.idatt2003.view.components; import javafx.scene.control.Button; @@ -16,5 +16,7 @@ public class GameButton extends Button { super(text); this.setMaxWidth(180); this.setMinWidth(180); + this.setMinHeight(40); + this.setMaxHeight(40); } } diff --git a/src/main/java/org/example/chaosgame/view/components/GameHeader.java b/src/main/java/org/idatt2003/view/components/GameHeader.java similarity index 89% rename from src/main/java/org/example/chaosgame/view/components/GameHeader.java rename to src/main/java/org/idatt2003/view/components/GameHeader.java index 5de562b39bab0d07741a87f7c121a4ad1b0978a5..25b0589b3b1bbeedfdb4426120cd2c12fb919b04 100644 --- a/src/main/java/org/example/chaosgame/view/components/GameHeader.java +++ b/src/main/java/org/idatt2003/view/components/GameHeader.java @@ -1,4 +1,4 @@ -package org.example.chaosgame.view.components; +package org.idatt2003.view.components; import javafx.scene.text.Text; diff --git a/src/main/java/org/example/chaosgame/view/components/HomeButton.java b/src/main/java/org/idatt2003/view/components/HomeButton.java similarity index 93% rename from src/main/java/org/example/chaosgame/view/components/HomeButton.java rename to src/main/java/org/idatt2003/view/components/HomeButton.java index 2bec4e24f94f2c4392b9d5fe79232bc013a3f7e7..674bb26042f2d86d4847f5ec2c1a6ccd1e7083e6 100644 --- a/src/main/java/org/example/chaosgame/view/components/HomeButton.java +++ b/src/main/java/org/idatt2003/view/components/HomeButton.java @@ -1,4 +1,4 @@ -package org.example.chaosgame.view.components; +package org.idatt2003.view.components; import java.util.Objects; import javafx.scene.control.Button; diff --git a/src/main/java/org/example/chaosgame/view/components/MinMaxDialog.java b/src/main/java/org/idatt2003/view/components/MinMaxDialog.java similarity index 58% rename from src/main/java/org/example/chaosgame/view/components/MinMaxDialog.java rename to src/main/java/org/idatt2003/view/components/MinMaxDialog.java index 3286a6b549c2d5c0a9515c11ae87e07c785e67d1..42ee1c603be47e7747cf61cd01460cdd0f6c9ec4 100644 --- a/src/main/java/org/example/chaosgame/view/components/MinMaxDialog.java +++ b/src/main/java/org/idatt2003/view/components/MinMaxDialog.java @@ -1,7 +1,6 @@ -package org.example.chaosgame.view.components; +package org.idatt2003.view.components; import java.util.List; - import javafx.scene.control.ButtonBar; import javafx.scene.control.ButtonType; import javafx.scene.control.Dialog; @@ -13,10 +12,10 @@ import javafx.scene.layout.GridPane; * The dialog has fields for the min and max x and y coordinates. */ public class MinMaxDialog extends Dialog<List<String>> { - private final TextField minXField; - private final TextField minYField; - private final TextField maxXField; - private final TextField maxYField; + private final TextField xMinField; + private final TextField yMinField; + private final TextField xMaxField; + private final TextField yMaxField; /** * Constructor for the MinMaxDialog. @@ -33,29 +32,29 @@ public class MinMaxDialog extends Dialog<List<String>> { grid.setHgap(10); grid.setVgap(10); - minXField = new TextField(); - minXField.setPromptText("Min X"); - minYField = new TextField(); - minYField.setPromptText("Min Y"); + xMinField = new TextField(); + xMinField.setPromptText("Min X"); + yMinField = new TextField(); + yMinField.setPromptText("Min Y"); - maxXField = new TextField(); - maxXField.setPromptText("Max X"); - maxYField = new TextField(); - maxYField.setPromptText("Max Y"); + xMaxField = new TextField(); + xMaxField.setPromptText("Max X"); + yMaxField = new TextField(); + yMaxField.setPromptText("Max Y"); - grid.add(minXField, 0, 0); - grid.add(minYField, 1, 0); - grid.add(maxXField, 0, 1); - grid.add(maxYField, 1, 1); + grid.add(xMinField, 0, 0); + grid.add(yMinField, 1, 0); + grid.add(xMaxField, 0, 1); + grid.add(yMaxField, 1, 1); getDialogPane().setContent(grid); setResultConverter(dialogButton -> { if (dialogButton == saveButtonType) { - String minX = minXField.getText(); - String minY = minYField.getText(); - String maxX = maxXField.getText(); - String maxY = maxYField.getText(); + String minX = xMinField.getText(); + String minY = yMinField.getText(); + String maxX = xMaxField.getText(); + String maxY = yMaxField.getText(); return List.of(minX, minY, maxX, maxY); } return null; diff --git a/src/main/java/org/example/chaosgame/view/components/NumberOfStepsInput.java b/src/main/java/org/idatt2003/view/components/NumberOfStepsInput.java similarity index 91% rename from src/main/java/org/example/chaosgame/view/components/NumberOfStepsInput.java rename to src/main/java/org/idatt2003/view/components/NumberOfStepsInput.java index ee59938e76cb7a23b6a565220a5ee04d958c0103..19e052aabe2dbf35d7718cbfdc194c61253ad577 100644 --- a/src/main/java/org/example/chaosgame/view/components/NumberOfStepsInput.java +++ b/src/main/java/org/idatt2003/view/components/NumberOfStepsInput.java @@ -1,4 +1,4 @@ -package org.example.chaosgame.view.components; +package org.idatt2003.view.components; import javafx.scene.control.TextField; diff --git a/src/main/java/org/example/chaosgame/view/components/SideBar.java b/src/main/java/org/idatt2003/view/components/SideBar.java similarity index 89% rename from src/main/java/org/example/chaosgame/view/components/SideBar.java rename to src/main/java/org/idatt2003/view/components/SideBar.java index d866803f75142d8bffb6016ec700a8a849e7959a..3bf3c60d67a64961c23441fd87dcb915a4fce8dc 100644 --- a/src/main/java/org/example/chaosgame/view/components/SideBar.java +++ b/src/main/java/org/idatt2003/view/components/SideBar.java @@ -1,12 +1,12 @@ -package org.example.chaosgame.view.components; +package org.idatt2003.view.components; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.control.Button; import javafx.scene.control.TextField; import javafx.scene.layout.VBox; -import org.example.chaosgame.controller.ChaosGameController; -import org.example.chaosgame.controller.ExploreGameController; +import org.idatt2003.controller.ChaosGameController; +import org.idatt2003.controller.ExploreGameController; /** * Class for the sidebar, extends VBox. @@ -47,12 +47,12 @@ public class SideBar extends VBox { chaosGameController::updateFractalColor); this.getChildren().addAll( - fractalSelectionBox, colorPicker, coordinatesButton, - createOwnFractal, saveFractalButton, openFileButton, + fractalSelectionBox, colorPicker, createOwnFractal, + coordinatesButton, saveFractalButton, openFileButton, numberOfStepsInput, runGame, resetGame); this.setAlignment(Pos.CENTER_RIGHT); - VBox.setMargin(coordinatesButton, new Insets(30, 0, 0, 0)); + VBox.setMargin(createOwnFractal, new Insets(30, 0, 0, 0)); VBox.setMargin(numberOfStepsInput, new Insets(30, 0, 0, 0)); this.getStyleClass().add("side-bar"); diff --git a/src/main/java/org/example/chaosgame/view/components/SliderImaginaryPart.java b/src/main/java/org/idatt2003/view/components/SliderImaginaryPart.java similarity index 73% rename from src/main/java/org/example/chaosgame/view/components/SliderImaginaryPart.java rename to src/main/java/org/idatt2003/view/components/SliderImaginaryPart.java index 14649a0f31469f9d64083859a2b53ec1d5b87518..5a557563c0640718d99600ca424fb7ad1e8375a6 100644 --- a/src/main/java/org/example/chaosgame/view/components/SliderImaginaryPart.java +++ b/src/main/java/org/idatt2003/view/components/SliderImaginaryPart.java @@ -1,6 +1,6 @@ -package org.example.chaosgame.view.components; +package org.idatt2003.view.components; -import org.example.chaosgame.controller.interfaces.GameController; +import org.idatt2003.controller.interfaces.GameController; /** * Class for the imaginary part slider, extends BaseSlider. @@ -18,7 +18,9 @@ public class SliderImaginaryPart extends BaseSlider { } /** - * {@inheritDoc} + * Get the complex number type of the slider. + * + * @return the part type of the slider */ @Override protected String getPartType() { diff --git a/src/main/java/org/example/chaosgame/view/components/SliderRealPart.java b/src/main/java/org/idatt2003/view/components/SliderRealPart.java similarity index 71% rename from src/main/java/org/example/chaosgame/view/components/SliderRealPart.java rename to src/main/java/org/idatt2003/view/components/SliderRealPart.java index 48926964ef8a20808c1dc612775d2866df9feeb7..851e913cc41484adf740f60b2302f2fff3d1f02b 100644 --- a/src/main/java/org/example/chaosgame/view/components/SliderRealPart.java +++ b/src/main/java/org/idatt2003/view/components/SliderRealPart.java @@ -1,6 +1,6 @@ -package org.example.chaosgame.view.components; +package org.idatt2003.view.components; -import org.example.chaosgame.controller.interfaces.GameController; +import org.idatt2003.controller.interfaces.GameController; /** * Class for the real part slider, extends BaseSlider. @@ -17,6 +17,11 @@ public class SliderRealPart extends BaseSlider { this.getStyleClass().add("top-bottom-padding"); } + /** + * Get the complex number type of the slider. + * + * @return the part type of the slider + */ @Override protected String getPartType() { return "real"; diff --git a/src/main/java/org/example/chaosgame/view/components/TopBar.java b/src/main/java/org/idatt2003/view/components/TopBar.java similarity index 78% rename from src/main/java/org/example/chaosgame/view/components/TopBar.java rename to src/main/java/org/idatt2003/view/components/TopBar.java index 90a397acbe8e35a9c228236fa941c7bd80153b9f..e6b5cd0665782d0bb5ba659372d1936ccaa7bbd6 100644 --- a/src/main/java/org/example/chaosgame/view/components/TopBar.java +++ b/src/main/java/org/idatt2003/view/components/TopBar.java @@ -1,12 +1,12 @@ -package org.example.chaosgame.view.components; +package org.idatt2003.view.components; import javafx.geometry.Pos; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.layout.HBox; -import org.example.chaosgame.controller.interfaces.GameController; -import org.example.chaosgame.model.linalg.Vector2D; -import org.example.chaosgame.model.transformations.Transform2D; +import org.idatt2003.controller.interfaces.GameController; +import org.idatt2003.model.linalg.Vector2D; +import org.idatt2003.model.transformations.Transform2D; /** * Class for the top bar, extends HBox. @@ -60,7 +60,10 @@ public class TopBar extends HBox { * @param max the max coordinates */ public void updateTopBar(Vector2D min, Vector2D max) { - coordinatesLabel.setText("Coordinates: " + (double) Math.round(min.getX() * 100) / 100 + " , " + (double) Math.round(min.getY() * 100) / 100 + - " (min), " + (double) Math.round(max.getX() * 100) / 100 + ", " + (double) Math.round(max.getY() * 100) / 100 + " (max)"); + coordinatesLabel.setText("Coordinates: " + + (double) Math.round(min.getX() * 100) / 100 + " , " + + (double) Math.round(min.getY() * 100) / 100 + " (min), " + + (double) Math.round(max.getX() * 100) / 100 + ", " + + (double) Math.round(max.getY() * 100) / 100 + " (max)"); } } diff --git a/src/main/resources/media/ChaosVideoFinal.mp4 b/src/main/resources/media/ChaosVideoFinal.mp4 index b2bb62c540422906e609e26a7ace544f3fc0af41..8dafc2098ec921f51e9c2587040c8f8813ea10c4 100644 Binary files a/src/main/resources/media/ChaosVideoFinal.mp4 and b/src/main/resources/media/ChaosVideoFinal.mp4 differ diff --git a/src/test/java/org/example/chaosgame/.idea/.gitignore b/src/test/java/org/example/chaosgame/.idea/.gitignore deleted file mode 100644 index 13566b81b018ad684f3a35fee301741b2734c8f4..0000000000000000000000000000000000000000 --- a/src/test/java/org/example/chaosgame/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/src/test/java/org/example/chaosgame/.idea/checkstyle-idea.xml b/src/test/java/org/example/chaosgame/.idea/checkstyle-idea.xml deleted file mode 100644 index 3339f5f9b69cd39465df2570b84c4f8a1447fed1..0000000000000000000000000000000000000000 --- a/src/test/java/org/example/chaosgame/.idea/checkstyle-idea.xml +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="CheckStyle-IDEA" serialisationVersion="2"> - <checkstyleVersion>10.16.0</checkstyleVersion> - <scanScope>JavaOnly</scanScope> - <option name="thirdPartyClasspath" /> - <option name="activeLocationIds" /> - <option name="locations"> - <list> - <ConfigurationLocation id="bundled-sun-checks" type="BUNDLED" scope="All" description="Sun Checks">(bundled)</ConfigurationLocation> - <ConfigurationLocation id="bundled-google-checks" type="BUNDLED" scope="All" description="Google Checks">(bundled)</ConfigurationLocation> - </list> - </option> - </component> -</project> \ No newline at end of file diff --git a/src/test/java/org/example/chaosgame/.idea/misc.xml b/src/test/java/org/example/chaosgame/.idea/misc.xml deleted file mode 100644 index 69ace3f6affaf674f40a55887f3d6f3564afd626..0000000000000000000000000000000000000000 --- a/src/test/java/org/example/chaosgame/.idea/misc.xml +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="openjdk-21" project-jdk-type="JavaSDK"> - <output url="file://$PROJECT_DIR$/out" /> - </component> -</project> \ No newline at end of file diff --git a/src/test/java/org/example/chaosgame/.idea/modules.xml b/src/test/java/org/example/chaosgame/.idea/modules.xml deleted file mode 100644 index 736e215e9a3892ce6caf68e1ce25b8c9dd87b2c6..0000000000000000000000000000000000000000 --- a/src/test/java/org/example/chaosgame/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="ProjectModuleManager"> - <modules> - <module fileurl="file://$PROJECT_DIR$/chaosgame.iml" filepath="$PROJECT_DIR$/chaosgame.iml" /> - </modules> - </component> -</project> \ No newline at end of file diff --git a/src/test/java/org/example/chaosgame/controller/HomeControllerTest.java b/src/test/java/org/example/chaosgame/controller/HomeControllerTest.java deleted file mode 100644 index c32f31ad6d11ba9334513ff41893d28879e4a99a..0000000000000000000000000000000000000000 --- a/src/test/java/org/example/chaosgame/controller/HomeControllerTest.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.example.chaosgame.controller; - -import org.junit.jupiter.api.Test; - -class HomeControllerTest { - - @Test - void getHomePage() { - } - - @Test - void mouseEvent() { - } -} \ No newline at end of file diff --git a/src/test/java/org/example/chaosgame/controller/ChaosGameControllerTest.java b/src/test/java/org/idatt2003/controller/ChaosGameControllerTest.java similarity index 71% rename from src/test/java/org/example/chaosgame/controller/ChaosGameControllerTest.java rename to src/test/java/org/idatt2003/controller/ChaosGameControllerTest.java index 1e16946f1d1a9978186686d4afb38f6e343cbe8e..d486fc6766213bf7f5a4aa1c066b53814ba887ad 100644 --- a/src/test/java/org/example/chaosgame/controller/ChaosGameControllerTest.java +++ b/src/test/java/org/idatt2003/controller/ChaosGameControllerTest.java @@ -1,7 +1,13 @@ -package org.example.chaosgame.controller; +package org.idatt2003.controller; import org.junit.jupiter.api.Test; +/** + * Test class for the ChaosGameController class. + * Tried to implement Mockito to test the ChaosGameController class. + * But we could not because the controller requires JavaFX components. + * We have tested the ChaosGameController class manually. + */ class ChaosGameControllerTest { @Test diff --git a/src/test/java/org/example/chaosgame/model/chaos/ChaosGameDescriptionFactoryTest.java b/src/test/java/org/idatt2003/controller/ChaosGameDescriptionFactoryTest.java similarity index 83% rename from src/test/java/org/example/chaosgame/model/chaos/ChaosGameDescriptionFactoryTest.java rename to src/test/java/org/idatt2003/controller/ChaosGameDescriptionFactoryTest.java index 00e0ad8b31c767e8df81fd56b14cb5b5f93fb962..b7853a51a07364192c7054c4df54a53066bb0be3 100644 --- a/src/test/java/org/example/chaosgame/model/chaos/ChaosGameDescriptionFactoryTest.java +++ b/src/test/java/org/idatt2003/controller/ChaosGameDescriptionFactoryTest.java @@ -1,4 +1,4 @@ -package org.example.chaosgame.model.chaos; +package org.idatt2003.controller; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertInstanceOf; @@ -6,17 +6,29 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; import java.util.List; -import org.example.chaosgame.controller.ChaosGameDescriptionFactory; -import org.example.chaosgame.model.linalg.Complex; -import org.example.chaosgame.model.linalg.Matrix2x2; -import org.example.chaosgame.model.linalg.Vector2D; -import org.example.chaosgame.model.transformations.AffineTransform2D; -import org.example.chaosgame.model.transformations.JuliaTransform; +import org.idatt2003.model.chaos.ChaosGameDescription; +import org.idatt2003.model.chaos.ChaosGameType; +import org.idatt2003.model.linalg.Complex; +import org.idatt2003.model.linalg.Matrix2x2; +import org.idatt2003.model.linalg.Vector2D; +import org.idatt2003.model.transformations.AffineTransform2D; +import org.idatt2003.model.transformations.JuliaTransform; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +/** + * Test class for the ChaosGameDescriptionFactory class. + * Tests the get method in the ChaosGameDescriptionFactory class, and + * that the factory returns the correct ChaosGameDescription object. + * + * <p>For each method that creates a ChaosGameDescription object, + * we test that the object is not null, + * that the object is an instance of ChaosGameDescription, + * and that the object is equal to the expected object. + * After the first tests were created, we used Copilot to generate the rest of the tests. + */ class ChaosGameDescriptionFactoryTest { private static ChaosGameDescription expectedJulia; private static ChaosGameDescription expectedSierpinski; diff --git a/src/test/java/org/example/chaosgame/model/chaos/ChaosGameFileHandlerTest.java b/src/test/java/org/idatt2003/controller/ChaosGameFileHandlerTest.java similarity index 93% rename from src/test/java/org/example/chaosgame/model/chaos/ChaosGameFileHandlerTest.java rename to src/test/java/org/idatt2003/controller/ChaosGameFileHandlerTest.java index 32c0fa2d95254b55ec7692efd67634e8735a3659..db942ef38f742c4a10e3b5841373e38e4cee1d7e 100644 --- a/src/test/java/org/example/chaosgame/model/chaos/ChaosGameFileHandlerTest.java +++ b/src/test/java/org/idatt2003/controller/ChaosGameFileHandlerTest.java @@ -1,4 +1,4 @@ -package org.example.chaosgame.model.chaos; +package org.idatt2003.controller; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertInstanceOf; @@ -10,22 +10,27 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.List; -import org.example.chaosgame.controller.ChaosGameFileHandler; -import org.example.chaosgame.model.linalg.Complex; -import org.example.chaosgame.model.linalg.Matrix2x2; -import org.example.chaosgame.model.linalg.Vector2D; -import org.example.chaosgame.model.transformations.AffineTransform2D; -import org.example.chaosgame.model.transformations.JuliaTransform; -import org.example.chaosgame.model.transformations.Transform2D; + +import org.idatt2003.model.chaos.ChaosGameDescription; +import org.idatt2003.model.linalg.Complex; +import org.idatt2003.model.linalg.Matrix2x2; +import org.idatt2003.model.linalg.Vector2D; +import org.idatt2003.model.transformations.AffineTransform2D; +import org.idatt2003.model.transformations.JuliaTransform; +import org.idatt2003.model.transformations.Transform2D; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; - - - - +/** + * Test class for the ChaosGameFileHandler class. + * Tests the readFromFile and writeToFile methods. + * Tests the skipComments, selectTransformation, parseVector, parseAffine and parseJulia methods. + * GitHub Copilot helped with setting up test data and test cases. + * Especially in the testReadValidAffine and testReadValidJulia methods, + * as these are methods that handle much logic. + */ class ChaosGameFileHandlerTest { private static ChaosGameFileHandler fileHandler; private static String validAffineContent; diff --git a/src/test/java/org/example/chaosgame/controller/ExploreGameControllerTest.java b/src/test/java/org/idatt2003/controller/ExploreGameControllerTest.java similarity index 69% rename from src/test/java/org/example/chaosgame/controller/ExploreGameControllerTest.java rename to src/test/java/org/idatt2003/controller/ExploreGameControllerTest.java index 05f43e043ac30ae963730e3b8c98e4a8d67a78ea..a73d75b7112bac8d10ec8fbf64d956727391c77e 100644 --- a/src/test/java/org/example/chaosgame/controller/ExploreGameControllerTest.java +++ b/src/test/java/org/idatt2003/controller/ExploreGameControllerTest.java @@ -1,7 +1,13 @@ -package org.example.chaosgame.controller; +package org.idatt2003.controller; import org.junit.jupiter.api.Test; +/** + * Test class for the ExploreGameController class. + * Tried to implement Mockito to test the ExploreGameController class. + * But we could not because the controller requires JavaFX components. + * We have tested the ExploreGameController class manually. + */ class ExploreGameControllerTest { @Test diff --git a/src/test/java/org/idatt2003/controller/HomeControllerTest.java b/src/test/java/org/idatt2003/controller/HomeControllerTest.java new file mode 100644 index 0000000000000000000000000000000000000000..8c9e7b79b466c07e84b320fed560e1ab28e269be --- /dev/null +++ b/src/test/java/org/idatt2003/controller/HomeControllerTest.java @@ -0,0 +1,18 @@ +package org.idatt2003.controller; + +import org.junit.jupiter.api.Test; + +/** + * Test class for the HomeController class. + * We have tested the HomeController class manually. + */ +class HomeControllerTest { + + @Test + void getHomePage() { + } + + @Test + void mouseEvent() { + } +} \ No newline at end of file diff --git a/src/test/java/org/example/chaosgame/controller/PageControllerTest.java b/src/test/java/org/idatt2003/controller/PageControllerTest.java similarity index 53% rename from src/test/java/org/example/chaosgame/controller/PageControllerTest.java rename to src/test/java/org/idatt2003/controller/PageControllerTest.java index 7cc833bfb1dc27426e54df472030aa6002e7e3ed..effd2ae8e2fa17bfabe2b4566e6aadc1ee4b50cb 100644 --- a/src/test/java/org/example/chaosgame/controller/PageControllerTest.java +++ b/src/test/java/org/idatt2003/controller/PageControllerTest.java @@ -1,9 +1,11 @@ -package org.example.chaosgame.controller; +package org.idatt2003.controller; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.*; - +/** + * Test class for the PageController class. + * We have tested the PageController class manually. + */ class PageControllerTest { @Test diff --git a/src/test/java/org/example/chaosgame/model/chaos/ChaosCanvasTest.java b/src/test/java/org/idatt2003/model/chaos/ChaosCanvasTest.java similarity index 96% rename from src/test/java/org/example/chaosgame/model/chaos/ChaosCanvasTest.java rename to src/test/java/org/idatt2003/model/chaos/ChaosCanvasTest.java index a55ef4c5ce55787d116f5675911918a616002274..a9b76a0036adfeae15087dbb13a47e8299490e88 100644 --- a/src/test/java/org/example/chaosgame/model/chaos/ChaosCanvasTest.java +++ b/src/test/java/org/idatt2003/model/chaos/ChaosCanvasTest.java @@ -1,7 +1,7 @@ -package org.example.chaosgame.model.chaos; +package org.idatt2003.model.chaos; -import org.example.chaosgame.model.linalg.Vector2D; -import org.example.chaosgame.model.transformations.AffineTransform2D; +import org.idatt2003.model.linalg.Vector2D; +import org.idatt2003.model.transformations.AffineTransform2D; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; diff --git a/src/test/java/org/example/chaosgame/model/chaos/ChaosGameDescriptionTest.java b/src/test/java/org/idatt2003/model/chaos/ChaosGameDescriptionTest.java similarity index 95% rename from src/test/java/org/example/chaosgame/model/chaos/ChaosGameDescriptionTest.java rename to src/test/java/org/idatt2003/model/chaos/ChaosGameDescriptionTest.java index c85c23b3fcbc496ad9fb13f41cdba2b9932a7eab..d65f131ab266cffaa0317570045975c3aaa21e84 100644 --- a/src/test/java/org/example/chaosgame/model/chaos/ChaosGameDescriptionTest.java +++ b/src/test/java/org/idatt2003/model/chaos/ChaosGameDescriptionTest.java @@ -1,4 +1,4 @@ -package org.example.chaosgame.model.chaos; +package org.idatt2003.model.chaos; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -8,10 +8,10 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import java.util.Arrays; import java.util.List; -import org.example.chaosgame.model.linalg.Matrix2x2; -import org.example.chaosgame.model.linalg.Vector2D; -import org.example.chaosgame.model.transformations.AffineTransform2D; -import org.example.chaosgame.model.transformations.Transform2D; +import org.idatt2003.model.linalg.Matrix2x2; +import org.idatt2003.model.linalg.Vector2D; +import org.idatt2003.model.transformations.AffineTransform2D; +import org.idatt2003.model.transformations.Transform2D; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; diff --git a/src/test/java/org/example/chaosgame/model/chaos/ChaosGameTest.java b/src/test/java/org/idatt2003/model/chaos/ChaosGameTest.java similarity index 94% rename from src/test/java/org/example/chaosgame/model/chaos/ChaosGameTest.java rename to src/test/java/org/idatt2003/model/chaos/ChaosGameTest.java index 5d967a7f1718f0bdc92c934b2abb08212207de42..d913b6652377f255b9216ce57ebf3b8844df05db 100644 --- a/src/test/java/org/example/chaosgame/model/chaos/ChaosGameTest.java +++ b/src/test/java/org/idatt2003/model/chaos/ChaosGameTest.java @@ -1,4 +1,4 @@ -package org.example.chaosgame.model.chaos; +package org.idatt2003.model.chaos; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -7,12 +7,12 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.fail; import java.util.List; -import org.example.chaosgame.controller.interfaces.Observer; -import org.example.chaosgame.model.linalg.Complex; -import org.example.chaosgame.model.linalg.Matrix2x2; -import org.example.chaosgame.model.linalg.Vector2D; -import org.example.chaosgame.model.transformations.AffineTransform2D; -import org.example.chaosgame.model.transformations.JuliaTransform; +import org.idatt2003.controller.interfaces.Observer; +import org.idatt2003.model.linalg.Complex; +import org.idatt2003.model.linalg.Matrix2x2; +import org.idatt2003.model.linalg.Vector2D; +import org.idatt2003.model.transformations.AffineTransform2D; +import org.idatt2003.model.transformations.JuliaTransform; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; diff --git a/src/test/java/org/example/chaosgame/model/chaos/ExploreGameTest.java b/src/test/java/org/idatt2003/model/chaos/ExploreGameTest.java similarity index 76% rename from src/test/java/org/example/chaosgame/model/chaos/ExploreGameTest.java rename to src/test/java/org/idatt2003/model/chaos/ExploreGameTest.java index ab56bbba654425e121d2513449db4646e630adce..463bc6fc38fa1194b19ea563b6719579d2c0573b 100644 --- a/src/test/java/org/example/chaosgame/model/chaos/ExploreGameTest.java +++ b/src/test/java/org/idatt2003/model/chaos/ExploreGameTest.java @@ -1,10 +1,10 @@ -package org.example.chaosgame.model.chaos; +package org.idatt2003.model.chaos; -import org.example.chaosgame.model.linalg.Complex; -import org.example.chaosgame.model.linalg.Vector2D; -import org.example.chaosgame.model.transformations.ExploreJulia; -import org.example.chaosgame.model.transformations.Transform2D; -import org.example.chaosgame.controller.interfaces.Observer; +import org.idatt2003.model.linalg.Complex; +import org.idatt2003.model.linalg.Vector2D; +import org.idatt2003.model.transformations.ExploreJulia; +import org.idatt2003.model.transformations.Transform2D; +import org.idatt2003.controller.interfaces.Observer; import org.junit.jupiter.api.*; import java.util.ArrayList; @@ -47,7 +47,7 @@ class ExploreGameTest { newTransforms.add(new ExploreJulia(new Complex(1, 1))); ChaosGameDescription newDescription = new ChaosGameDescription(newMinCoords, newMaxCoords, newTransforms); - exploreGame.setExploreGame(newDescription, 200, 200); + exploreGame.setExploreGame(newDescription, new ChaosCanvas(200, 200, newMinCoords, newMaxCoords)); assertEquals(newDescription, exploreGame.getDescription()); ChaosCanvas canvas = exploreGame.getCanvas(); @@ -70,19 +70,6 @@ class ExploreGameTest { assertEquals(description, exploreGame.getDescription()); } - @Test - void testSetChaosCanvas() { - Vector2D newMinCoords = new Vector2D(-2, -2); - Vector2D newMaxCoords = new Vector2D(2, 2); - exploreGame.setChaosCanvas(newMinCoords, newMaxCoords, 300, 300); - - ChaosCanvas canvas = exploreGame.getCanvas(); - assertEquals(300, canvas.getWidth()); - assertEquals(300, canvas.getHeight()); - assertEquals(newMinCoords, canvas.getMinCoords()); - assertEquals(newMaxCoords, canvas.getMaxCoords()); - } - @Test void testExploreFractals() { diff --git a/src/test/java/org/example/chaosgame/model/linalg/ComplexTest.java b/src/test/java/org/idatt2003/model/linalg/ComplexTest.java similarity index 91% rename from src/test/java/org/example/chaosgame/model/linalg/ComplexTest.java rename to src/test/java/org/idatt2003/model/linalg/ComplexTest.java index 5cb701a87fba88d8556f81947b3abaa1fb582555..888884fa9758b5533a1728b95e0699a0a1fb86aa 100644 --- a/src/test/java/org/example/chaosgame/model/linalg/ComplexTest.java +++ b/src/test/java/org/idatt2003/model/linalg/ComplexTest.java @@ -1,6 +1,5 @@ -package org.example.chaosgame.model.linalg; +package org.idatt2003.model.linalg; -import org.example.chaosgame.model.linalg.Complex; import org.junit.jupiter.api.*; diff --git a/src/test/java/org/example/chaosgame/model/linalg/Matrix2x2Test.java b/src/test/java/org/idatt2003/model/linalg/Matrix2x2Test.java similarity index 90% rename from src/test/java/org/example/chaosgame/model/linalg/Matrix2x2Test.java rename to src/test/java/org/idatt2003/model/linalg/Matrix2x2Test.java index bb210cb61a55047bdd3e67f1d9deb27190bd0a40..10b7ce93fb3b46f9e478d98fbc00e9fe373f9fb4 100644 --- a/src/test/java/org/example/chaosgame/model/linalg/Matrix2x2Test.java +++ b/src/test/java/org/idatt2003/model/linalg/Matrix2x2Test.java @@ -1,7 +1,5 @@ -package org.example.chaosgame.model.linalg; +package org.idatt2003.model.linalg; -import org.example.chaosgame.model.linalg.Matrix2x2; -import org.example.chaosgame.model.linalg.Vector2D; import org.junit.jupiter.api.*; import static org.junit.jupiter.api.Assertions.*; diff --git a/src/test/java/org/example/chaosgame/model/linalg/Vector2DTest.java b/src/test/java/org/idatt2003/model/linalg/Vector2DTest.java similarity index 97% rename from src/test/java/org/example/chaosgame/model/linalg/Vector2DTest.java rename to src/test/java/org/idatt2003/model/linalg/Vector2DTest.java index 3d432956948a6ea1985ddd1c3c3e02d6d9fd85a2..3511b0b90a9846b9ba6804aeb56a2432744fb07d 100644 --- a/src/test/java/org/example/chaosgame/model/linalg/Vector2DTest.java +++ b/src/test/java/org/idatt2003/model/linalg/Vector2DTest.java @@ -1,6 +1,5 @@ -package org.example.chaosgame.model.linalg; +package org.idatt2003.model.linalg; -import org.example.chaosgame.model.linalg.Vector2D; import org.junit.jupiter.api.*; import static org.junit.jupiter.api.Assertions.*; diff --git a/src/test/java/org/example/chaosgame/model/transformations/AffineTransform2DTest.java b/src/test/java/org/idatt2003/model/transformations/AffineTransform2DTest.java similarity index 63% rename from src/test/java/org/example/chaosgame/model/transformations/AffineTransform2DTest.java rename to src/test/java/org/idatt2003/model/transformations/AffineTransform2DTest.java index 3ac169cfe2adc38c08c7f344a1d8fad92fb9248b..25c82034aefbe83cb3a0e782024238508b7100e5 100644 --- a/src/test/java/org/example/chaosgame/model/transformations/AffineTransform2DTest.java +++ b/src/test/java/org/idatt2003/model/transformations/AffineTransform2DTest.java @@ -1,11 +1,10 @@ -package org.example.chaosgame.model.transformations; +package org.idatt2003.model.transformations; -import org.example.chaosgame.model.linalg.Matrix2x2; -import org.example.chaosgame.model.linalg.Vector2D; -import org.example.chaosgame.model.transformations.AffineTransform2D; -import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.*; +import org.idatt2003.model.linalg.Matrix2x2; +import org.idatt2003.model.linalg.Vector2D; +import org.junit.jupiter.api.Test; class AffineTransform2DTest { private final Matrix2x2 matrix = new Matrix2x2(0.5, 1.0, 1.0, 0.5); diff --git a/src/test/java/org/example/chaosgame/model/transformations/ExploreJuliaTest.java b/src/test/java/org/idatt2003/model/transformations/ExploreJuliaTest.java similarity index 83% rename from src/test/java/org/example/chaosgame/model/transformations/ExploreJuliaTest.java rename to src/test/java/org/idatt2003/model/transformations/ExploreJuliaTest.java index 55900355656ec5fd5f0d02927ff67eb57adb5392..59942c3a595d8ce01c22ba60a2783175b9f83c0e 100644 --- a/src/test/java/org/example/chaosgame/model/transformations/ExploreJuliaTest.java +++ b/src/test/java/org/idatt2003/model/transformations/ExploreJuliaTest.java @@ -1,7 +1,7 @@ -package org.example.chaosgame.model.transformations; +package org.idatt2003.model.transformations; -import org.example.chaosgame.model.linalg.Complex; -import org.example.chaosgame.model.linalg.Vector2D; +import org.idatt2003.model.linalg.Complex; +import org.idatt2003.model.linalg.Vector2D; import org.junit.jupiter.api.*; import static org.junit.jupiter.api.Assertions.*; @@ -24,7 +24,7 @@ class ExploreJuliaTest { @Test void testGetComplex() { - assertEquals(complexPoint, exploreJulia.getComplex()); + Assertions.assertEquals(complexPoint, exploreJulia.getComplex()); } @Nested @DisplayName("Test transforms") diff --git a/src/test/java/org/example/chaosgame/model/transformations/JuliaTransformTest.java b/src/test/java/org/idatt2003/model/transformations/JuliaTransformTest.java similarity index 70% rename from src/test/java/org/example/chaosgame/model/transformations/JuliaTransformTest.java rename to src/test/java/org/idatt2003/model/transformations/JuliaTransformTest.java index ef90b6a8acdb156d34e38aa36f7cd84f88f5257b..1950a0aaa98f9c00a04341126c6ca3b7bc50bd03 100644 --- a/src/test/java/org/example/chaosgame/model/transformations/JuliaTransformTest.java +++ b/src/test/java/org/idatt2003/model/transformations/JuliaTransformTest.java @@ -1,8 +1,7 @@ -package org.example.chaosgame.model.transformations; +package org.idatt2003.model.transformations; -import org.example.chaosgame.model.linalg.Complex; -import org.example.chaosgame.model.linalg.Vector2D; -import org.example.chaosgame.model.transformations.JuliaTransform; +import org.idatt2003.model.linalg.Vector2D; +import org.idatt2003.model.linalg.Complex; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*;