diff --git a/.idea/git_toolbox_prj.xml b/.idea/git_toolbox_prj.xml new file mode 100644 index 0000000000000000000000000000000000000000..02b915b85f9fb22b6e51491729131d93c18d906e --- /dev/null +++ b/.idea/git_toolbox_prj.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="GitToolBoxProjectSettings"> + <option name="commitMessageIssueKeyValidationOverride"> + <BoolValueOverride> + <option name="enabled" value="true" /> + </BoolValueOverride> + </option> + <option name="commitMessageValidationEnabledOverride"> + <BoolValueOverride> + <option name="enabled" value="true" /> + </BoolValueOverride> + </option> + </component> +</project> \ No newline at end of file diff --git a/pom.xml b/pom.xml index dc444fafeb54673e8bf2d361881a38fd89c6db45..df645b06d97133998573e0a2672795d7bfe64d2d 100644 --- a/pom.xml +++ b/pom.xml @@ -66,7 +66,7 @@ <id>default-cli</id> <configuration> <mainClass> - edu.ntnu.idatt2003.mappevurderingprog2/edu.ntnu.idatt2003.mappevurderingprog2.HelloApplication + edu.ntnu.idatt2003.mappevurderingprog2.MyApp </mainClass> <launcher>app</launcher> <jlinkZipName>app</jlinkZipName> diff --git a/src/main/java/edu/ntnu/idatt2003/mappevurderingprog2/MyApp.java b/src/main/java/edu/ntnu/idatt2003/mappevurderingprog2/MyApp.java new file mode 100644 index 0000000000000000000000000000000000000000..6cd1ab746b3a082516533b506c8d449c381e9e30 --- /dev/null +++ b/src/main/java/edu/ntnu/idatt2003/mappevurderingprog2/MyApp.java @@ -0,0 +1,20 @@ +package edu.ntnu.idatt2003.mappevurderingprog2; + +import edu.ntnu.idatt2003.mappevurderingprog2.views.View; +import javafx.application.Application; +import javafx.stage.Stage; + +public class MyApp extends Application{ + + @Override + public void start(Stage primaryStage) { + View view = new View(); + primaryStage.setScene(view.createScene()); + primaryStage.show(); + } + + public static void main(String[] args) { + launch(args); + } +} + diff --git a/src/main/java/edu/ntnu/idatt2003/mappevurderingprog2/controllers/Controller.java b/src/main/java/edu/ntnu/idatt2003/mappevurderingprog2/controllers/Controller.java new file mode 100644 index 0000000000000000000000000000000000000000..c1cb41d4f061599ae3d3d693584f7cb28d6eca8b --- /dev/null +++ b/src/main/java/edu/ntnu/idatt2003/mappevurderingprog2/controllers/Controller.java @@ -0,0 +1,5 @@ +package edu.ntnu.idatt2003.mappevurderingprog2.controllers; + +public class Controller{ + +} \ No newline at end of file diff --git a/src/main/java/edu/ntnu/idatt2003/mappevurderingprog2/models/Complex.java b/src/main/java/edu/ntnu/idatt2003/mappevurderingprog2/models/Complex.java index 607be63038c5f88e85addb3d8c4fd1abbe20430f..3907032f58821bc3a8b0dd59ce6b6af22946dca8 100644 --- a/src/main/java/edu/ntnu/idatt2003/mappevurderingprog2/models/Complex.java +++ b/src/main/java/edu/ntnu/idatt2003/mappevurderingprog2/models/Complex.java @@ -48,11 +48,18 @@ public class Complex extends Vector2D { */ public Complex sqrt() { double r = Math.sqrt(Math.pow(getX0(), 2) + Math.pow(getX1(), 2)); - double theta = Math.atan2(getX1(), getX0()); - return new Complex(Math.sqrt(r) * Math.cos(theta / 2), Math.sqrt(r) * Math.sin(theta / 2)); + double theta = Math.atan2(getX1(), getX0()) / 2.0; + double sqrtMag = Math.sqrt(r); + double realPart = sqrtMag * Math.cos(theta); + double imaginaryPart = sqrtMag * Math.sin(theta); + return new Complex(realPart, imaginaryPart); } public double magnitudeSquared() { return getX0() * getX0() + getX1() * getX1(); } + + public String toString() { + return "(" + getX0() + " + " + getX1() + "i)"; + } } \ No newline at end of file diff --git a/src/main/java/edu/ntnu/idatt2003/mappevurderingprog2/models/JuliaTransform.java b/src/main/java/edu/ntnu/idatt2003/mappevurderingprog2/models/JuliaTransform.java index 205838327c1c858f688b274e06ebd269c634905f..ddb60f8ba1a7ad5ee2aed2c474d1226ed105d5d8 100644 --- a/src/main/java/edu/ntnu/idatt2003/mappevurderingprog2/models/JuliaTransform.java +++ b/src/main/java/edu/ntnu/idatt2003/mappevurderingprog2/models/JuliaTransform.java @@ -53,7 +53,6 @@ public class JuliaTransform implements Transform2D { if (sign == -1) { subtracted = new Complex(-subtracted.getX0(), -subtracted.getX1()); } - return subtracted; } } diff --git a/src/main/java/edu/ntnu/idatt2003/mappevurderingprog2/models/chaos/ChaosCanvas.java b/src/main/java/edu/ntnu/idatt2003/mappevurderingprog2/models/chaos/ChaosCanvas.java index 62168e6de68baf7615babff369d5395b3733b14f..3eed296c7220a19de63ea246dcfd96fa6d4361a6 100644 --- a/src/main/java/edu/ntnu/idatt2003/mappevurderingprog2/models/chaos/ChaosCanvas.java +++ b/src/main/java/edu/ntnu/idatt2003/mappevurderingprog2/models/chaos/ChaosCanvas.java @@ -76,12 +76,17 @@ public class ChaosCanvas{ */ public void putPixel(Vector2D point) { - Vector2D indices = transformCoordsToIndices.transform(point); - int x = (int) indices.getX0(); - int y = (int) indices.getX1(); - canvas[x][y] = 1; + Vector2D indices = transformCoordsToIndices.transform(point); + int x = (int) indices.getX0(); + int y = (int) indices.getX1(); + if (x >= 0 && x < width && y >= 0 && y < height) { + if (canvas[x][y] != 1) { // Check if the pixel is not already set + canvas[x][y] = 1; + } + } else { + System.out.println("Indices out of bounds"); + } } - /** * Gets the canvas array. diff --git a/src/main/java/edu/ntnu/idatt2003/mappevurderingprog2/models/chaos/ChaosGame.java b/src/main/java/edu/ntnu/idatt2003/mappevurderingprog2/models/chaos/ChaosGame.java index 705aa751f92292e0d31b570287df427517780307..30b19d51591a9121292116c97e102b4a92d1bf33 100644 --- a/src/main/java/edu/ntnu/idatt2003/mappevurderingprog2/models/chaos/ChaosGame.java +++ b/src/main/java/edu/ntnu/idatt2003/mappevurderingprog2/models/chaos/ChaosGame.java @@ -47,7 +47,7 @@ public class ChaosGame { ui.start(); } - private static ChaosGameDescription createAffineChaosGameDescription() { + public static ChaosGameDescription createAffineChaosGameDescription() { List<Transform2D> transforms = new ArrayList<>(); transforms.add(new AffineTransform2D(new Matrix2x2(0.5, 0, 0, 0.5), new Vector2D(0, 0))); transforms.add(new AffineTransform2D(new Matrix2x2(0.5, 0, 0, 0.5), new Vector2D(0.5, 0))); @@ -55,13 +55,4 @@ public class ChaosGame { ChaosGameDescription description = new ChaosGameDescription(transforms, new Vector2D(0, 0), new Vector2D(1, 1)); return description; } - - private static ChaosGameDescription createJuliaChaosGameDescription() { - List<Transform2D> transforms = new ArrayList<>(); - Complex julaPoint = new Complex(-0.74543, 0.11301); - int sign = -1; - transforms.add(new JuliaTransform(julaPoint, sign)); - ChaosGameDescription description = new ChaosGameDescription(transforms, new Vector2D(-1.6, -1), new Vector2D(1.6, 1)); - return description; - } } \ No newline at end of file diff --git a/src/main/java/edu/ntnu/idatt2003/mappevurderingprog2/models/chaos/ChaosGameFileHandler.java b/src/main/java/edu/ntnu/idatt2003/mappevurderingprog2/models/chaos/ChaosGameFileHandler.java index ae13c64664a676d6ed477cc0fdf380363a555c57..a5fa82ddf65f0fc6447b7b61bbfe66d130d56b2f 100644 --- a/src/main/java/edu/ntnu/idatt2003/mappevurderingprog2/models/chaos/ChaosGameFileHandler.java +++ b/src/main/java/edu/ntnu/idatt2003/mappevurderingprog2/models/chaos/ChaosGameFileHandler.java @@ -32,7 +32,9 @@ public class ChaosGameFileHandler { if (transformType.equals("Affine2D")) { transforms.add(parseAffineTransform2D(line)); } else if (transformType.equals("Julia")) { - transforms.add(parseJuliaTransform(line)); + JuliaTransform transformation = parseJuliaTransform(line); + transforms.add(transformation); + transforms.add(new JuliaTransform(transformation.getPoint(), -transformation.getSign())); } } } diff --git a/src/main/java/edu/ntnu/idatt2003/mappevurderingprog2/utils/Colorpalette.java b/src/main/java/edu/ntnu/idatt2003/mappevurderingprog2/utils/Colorpalette.java new file mode 100644 index 0000000000000000000000000000000000000000..00fce62feed702579903cde8b36c9d6f36c359d3 --- /dev/null +++ b/src/main/java/edu/ntnu/idatt2003/mappevurderingprog2/utils/Colorpalette.java @@ -0,0 +1,9 @@ +package edu.ntnu.idatt2003.mappevurderingprog2.utils; + +import javafx.scene.paint.Color; + +public final class Colorpalette{ + public static final Color White = Color.web("#FFFFFF"); + public static final Color Black = Color.web("#000000"); + public static final Color Primary = Color.web("#778899"); +} \ No newline at end of file diff --git a/src/main/java/edu/ntnu/idatt2003/mappevurderingprog2/views/Components/MainBar.java b/src/main/java/edu/ntnu/idatt2003/mappevurderingprog2/views/Components/MainBar.java new file mode 100644 index 0000000000000000000000000000000000000000..c9c30fa9d03e79fc0b7de2b83ad95b612dc1f189 --- /dev/null +++ b/src/main/java/edu/ntnu/idatt2003/mappevurderingprog2/views/Components/MainBar.java @@ -0,0 +1,31 @@ +package edu.ntnu.idatt2003.mappevurderingprog2.views.Components; + +import edu.ntnu.idatt2003.mappevurderingprog2.models.chaos.ChaosGame; +import edu.ntnu.idatt2003.mappevurderingprog2.views.View; +import javafx.scene.control.Button; +import javafx.scene.control.ToolBar; + +// In your MainBar class +public class MainBar extends ToolBar { + private ChaosGame chaosGame; + private View view; + + public MainBar(ChaosGame chaosGame, View view){ + this.chaosGame = chaosGame; + this.view = view; + + Button transformButton = new Button(); + transformButton.setText("Transform"); + transformButton.setOnAction(event -> performTransformation()); + getItems().add(transformButton); + } + + private void performTransformation() { + // Run steps on the existing ChaosGame instance + chaosGame.runSteps(10000); + + // Get the ChaosCanvas and draw it on your application's canvas + view.redrawCanvas(chaosGame.getCanvas()); + } + +} \ No newline at end of file diff --git a/src/main/java/edu/ntnu/idatt2003/mappevurderingprog2/views/View.java b/src/main/java/edu/ntnu/idatt2003/mappevurderingprog2/views/View.java new file mode 100644 index 0000000000000000000000000000000000000000..aafd28416bbe408bc06afbb056e24acd96509e3e --- /dev/null +++ b/src/main/java/edu/ntnu/idatt2003/mappevurderingprog2/views/View.java @@ -0,0 +1,76 @@ +package edu.ntnu.idatt2003.mappevurderingprog2.views; + +import edu.ntnu.idatt2003.mappevurderingprog2.models.chaos.ChaosGame; +import edu.ntnu.idatt2003.mappevurderingprog2.models.chaos.ChaosGameDescription; +import edu.ntnu.idatt2003.mappevurderingprog2.utils.Colorpalette; +import edu.ntnu.idatt2003.mappevurderingprog2.views.Components.MainBar; +import edu.ntnu.idatt2003.mappevurderingprog2.models.chaos.ChaosCanvas; +import javafx.geometry.Insets; +import javafx.scene.Scene; +import javafx.scene.canvas.Canvas; +import javafx.scene.canvas.GraphicsContext; +import javafx.scene.layout.Background; +import javafx.scene.layout.BackgroundFill; +import javafx.scene.layout.BorderPane; +import javafx.scene.layout.CornerRadii; + +// In your View class +public class View extends BorderPane { + public int [][] canvas; + + private Canvas affineTransformationCanvas; + private GraphicsContext gc; + + public Scene createScene() { + this.setBackground(new Background(new BackgroundFill(Colorpalette.Primary, CornerRadii.EMPTY, Insets.EMPTY))); + + ChaosGameDescription description = ChaosGame.createAffineChaosGameDescription(); + ChaosGame chaosGame = new ChaosGame(description, 600, 600); + + affineTransformationCanvas = new Canvas(600, 400); + + gc = affineTransformationCanvas.getGraphicsContext2D(); + + MainBar mainBar = new MainBar(chaosGame, this); + + this.setTop(mainBar); + this.setCenter(affineTransformationCanvas); + + return new Scene(this, 900, 700); + } + + + public void redrawCanvas(ChaosCanvas chaosCanvas) { + int[][] newCanvas = chaosCanvas.getCanvasArray(); + this.canvas = newCanvas; + // Get the width and height of the canvas + double canvasWidth = affineTransformationCanvas.getWidth() - 20; + double canvasHeight = affineTransformationCanvas.getHeight() - 20; + + // Calculate the size of each pixel + double pixelWidth = canvasWidth / canvas[0].length; + double pixelHeight = canvasHeight / canvas.length; + + // Loop through each pixel in the canvas array + for (int i = 0; i < canvas.length; i++) { + for (int j = 0; j < canvas[i].length; j++) { + // Calculate the coordinates of the pixel on the canvas + double x = j * pixelWidth + 3; + double y = i * pixelHeight + 3; + + // Set the fill color based on the pixel value + if (canvas[i][j] == 0) { + gc.setFill(Colorpalette.White); + } else { + gc.setFill(Colorpalette.Black); + } + // Fill a rectangle representing the pixel + gc.fillRect(x, y, pixelWidth, pixelHeight); + } + } + } + + + + +} \ No newline at end of file