Skip to content
Snippets Groups Projects
Commit 821d166f authored by Tam Minh Le's avatar Tam Minh Le
Browse files

Merge branch 'Menu' into 'dev'

Finished the menu

See merge request !35
parents 0d5f0d09 7ee73ca2
No related branches found
No related tags found
2 merge requests!54Final release,!35Finished the menu
Showing
with 310 additions and 280 deletions
...@@ -34,12 +34,6 @@ public class GameController { ...@@ -34,12 +34,6 @@ public class GameController {
return ChaosGame.getInstance().getDescription().getTransforms(); return ChaosGame.getInstance().getDescription().getTransforms();
} }
public void setMinCoords(double minX0, double minX1) {
ChaosGame.getInstance().getDescription().setMinCoords(new Vector2D(minX0, minX1));
}
public void setMaxCoords(double maxX0, double maxX1) {
ChaosGame.getInstance().getDescription().setMaxCoords(new Vector2D(maxX0, maxX1));
}
public void setChaosGameDescription(ChaosGameDescription description) { public void setChaosGameDescription(ChaosGameDescription description) {
ChaosGame.getInstance().setDescription(description); ChaosGame.getInstance().setDescription(description);
} }
...@@ -56,12 +50,11 @@ public class GameController { ...@@ -56,12 +50,11 @@ public class GameController {
ChaosGame.getInstance().runSteps(); ChaosGame.getInstance().runSteps();
} }
public void setJuliaTransformation(Complex point) { public void setJuliaTransformation(Complex point, Vector2D minCoords, Vector2D maxCoords) {
List<Transform2D> transforms = new ArrayList<>(); List<Transform2D> transforms = new ArrayList<>();
// Add the JuliaTransform to the list of transforms
transforms.add(new JuliaTransform(point, -1)); transforms.add(new JuliaTransform(point, -1));
transforms.add(new JuliaTransform(point, 1)); transforms.add(new JuliaTransform(point, 1));
ChaosGame.getInstance().setDescription(ChaosGameDescription.createWithTransforms(transforms, new Vector2D(-1.6, -1.0), new Vector2D(1.6, 1.0))); ChaosGame.getInstance().setDescription(ChaosGameDescription.createWithTransforms(transforms, minCoords, maxCoords));
} }
public void setAffineTransformation(List<Transform2D> transforms, Vector2D minCoords, Vector2D maxCoords) { public void setAffineTransformation(List<Transform2D> transforms, Vector2D minCoords, Vector2D maxCoords) {
......
...@@ -55,14 +55,6 @@ public class Complex extends Vector2D { ...@@ -55,14 +55,6 @@ public class Complex extends Vector2D {
return new Complex(realPart, imaginaryPart); return new Complex(realPart, imaginaryPart);
} }
public Complex negate() {
return new Complex(-getX0(), -getX1());
}
public double abs() {
return Math.sqrt(getX0() * getX0() + getX1() * getX1());
}
public String toString() { public String toString() {
return "(" + getX0() + " + " + getX1() + "i)"; return "(" + getX0() + " + " + getX1() + "i)";
} }
......
...@@ -76,12 +76,10 @@ public class ChaosGame { ...@@ -76,12 +76,10 @@ public class ChaosGame {
} }
private void resetGame() { private void resetGame() {
// Reset or reinitialize internal states, e.g., clearing the canvas, resetting points, etc.
// Assuming there's a method to clear the canvas
if (this.canvas != null) { if (this.canvas != null) {
this.canvas.clear(); this.canvas.clear();
} }
this.currentPoint = new Complex(0, 0); // Reset to default position if applicable this.currentPoint = new Complex(0, 0);
} }
public void addObserver(ChaosGameObserver observer) { public void addObserver(ChaosGameObserver observer) {
......
package edu.ntnu.idatt2003.mappevurderingprog2.views.Components;
import edu.ntnu.idatt2003.mappevurderingprog2.controllers.GameController;
import edu.ntnu.idatt2003.mappevurderingprog2.models.AffineTransform2D;
import edu.ntnu.idatt2003.mappevurderingprog2.models.Matrix2x2;
import edu.ntnu.idatt2003.mappevurderingprog2.models.Transform2D;
import edu.ntnu.idatt2003.mappevurderingprog2.models.Vector2D;
import javafx.scene.Node;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonType;
import javafx.scene.control.Dialog;
import javafx.scene.control.Label;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
public class AffineDialog {
private Dialog<Void> dialog;
private GameController gameController;
private boolean isEditMode;
private GridPane grid = new GridPane();
public AffineDialog(GameController gameController, boolean isEditMode) {
this.gameController = gameController;
this.isEditMode = isEditMode;
setupDialog();
}
private void setupDialog() {
dialog = new Dialog<>();
dialog.setTitle("Edit Affine Transformation");
VBox dialogVBox = new VBox(10);
dialogVBox.setPadding(new Insets(10));
grid.setHgap(10);
grid.setVgap(10);
grid.setPadding(new Insets(10, 150, 10, 10));
TextField stepsField = new TextField(isEditMode ? String.valueOf(gameController.getCurrentSteps()) : "");
grid.add(new Label("Number of Steps:"), 0, 0);
grid.add(stepsField, 1, 0);
TextField minCoordsFieldX = new TextField(isEditMode ? String.valueOf(gameController.getCurrentMinCoords().getX0()) : "");
TextField minCoordsFieldY = new TextField(isEditMode ? String.valueOf(gameController.getCurrentMinCoords().getX1()) : "");
grid.add(new Label("Min Coordinates X:"), 0, 1);
grid.add(minCoordsFieldX, 1, 1);
grid.add(new Label("Min Coordinates Y:"), 2, 1);
grid.add(minCoordsFieldY, 3, 1);
TextField maxCoordsFieldX = new TextField(isEditMode ? String.valueOf(gameController.getCurrentMaxCoords().getX0()) : "");
TextField maxCoordsFieldY = new TextField(isEditMode ? String.valueOf(gameController.getCurrentMaxCoords().getX1()) : "");
grid.add(new Label("Max Coordinates X:"), 0, 2);
grid.add(maxCoordsFieldX, 1, 2);
grid.add(new Label("Max Coordinates Y:"), 2, 2);
grid.add(maxCoordsFieldY, 3, 2);
AtomicInteger rowIndex = new AtomicInteger(3);
grid.add(new Label("Matrix"), 0, rowIndex.get());
grid.add(new Label("Vector"), 1, rowIndex.get());
rowIndex.incrementAndGet();
List<Node[]> transformationFields = new ArrayList<>();
if (isEditMode) {
List<Transform2D> affineTransformations = gameController.getAffineTransformations();
for (Transform2D transform : affineTransformations) {
if (transform instanceof AffineTransform2D) {
addTransformationFields(grid, (AffineTransform2D) transform, rowIndex.get(), transformationFields);
rowIndex.incrementAndGet();
}
}
} else {
for (int i = 0; i < 3; i++) {
addEmptyTransformationFields(grid, rowIndex.get(), transformationFields);
rowIndex.incrementAndGet();
}
}
ScrollPane scrollPane = new ScrollPane(grid);
scrollPane.setFitToWidth(true);
scrollPane.setVbarPolicy(ScrollPane.ScrollBarPolicy.AS_NEEDED);
HBox editBox = new HBox(10);
editBox.setAlignment(Pos.CENTER_LEFT);
Button editButton = new Button(isEditMode ? "Edit Fractal" : "Create Fractal");
editButton.setOnAction(event -> {
try {
int steps = Integer.parseInt(stepsField.getText());
double minX = Double.parseDouble(minCoordsFieldX.getText());
double minY = Double.parseDouble(minCoordsFieldY.getText());
double maxX = Double.parseDouble(maxCoordsFieldX.getText());
double maxY = Double.parseDouble(maxCoordsFieldY.getText());
gameController.setChaosGameSteps(steps);
List<Transform2D> transforms = new ArrayList<>();
for (Node[] fields : transformationFields) {
TextField matrixField = (TextField) fields[0];
TextField vectorField = (TextField) fields[1];
double[][] matrixValues = parseMatrix(matrixField.getText());
double[] vectorValues = parseVector(vectorField.getText());
Matrix2x2 matrix = new Matrix2x2(matrixValues[0][0], matrixValues[0][1], matrixValues[1][0], matrixValues[1][1]);
Vector2D vector = new Vector2D(vectorValues[0], vectorValues[1]);
transforms.add(new AffineTransform2D(matrix, vector));
}
gameController.setAffineTransformation(transforms, new Vector2D(minX, minY), new Vector2D(maxX, maxY));
gameController.setChaosCanvasSize(200, 200);
gameController.runTransformation();
dialog.close();
} catch (NumberFormatException e) {
System.out.println("Invalid input for matrix or vector.");
}
});
HBox buttonBox = new HBox(10);
buttonBox.setAlignment(Pos.CENTER_RIGHT);
Button addBtn = new Button("Add Transformation");
addBtn.setOnAction(event -> {
addEmptyTransformationFields(grid, rowIndex.get(), transformationFields);
rowIndex.incrementAndGet();
});
Button removeBtn = new Button("Remove Transformation");
removeBtn.setOnAction(event -> {
if (!transformationFields.isEmpty()) {
Node[] lastFields = transformationFields.remove(transformationFields.size() - 1);
grid.getChildren().removeAll(lastFields);
rowIndex.decrementAndGet();
}
});
editBox.getChildren().addAll(editButton);
buttonBox.getChildren().addAll(addBtn, removeBtn);
dialogVBox.getChildren().addAll(scrollPane, editBox, buttonBox);
dialog.getDialogPane().setContent(dialogVBox);
dialog.getDialogPane().getButtonTypes().add(ButtonType.CLOSE);
}
private void addTransformationFields(GridPane grid, AffineTransform2D transform, int rowIndex, List<Node[]> fieldList) {
TextField matrixField = new TextField("[" + transform.getMatrix().getA00() + ", " + transform.getMatrix().getA01() + "; " + transform.getMatrix().getA10() + ", " + transform.getMatrix().getA11() + "]");
TextField vectorField = new TextField("[" + transform.getVector().getX0() + ", " + transform.getVector().getX1() + "]");
grid.add(matrixField, 0, rowIndex);
grid.add(vectorField, 1, rowIndex);
fieldList.add(new Node[]{matrixField, vectorField});
}
private void addEmptyTransformationFields(GridPane grid, int rowIndex, List<Node[]> fieldList) {
TextField matrixField = new TextField("[" + 1.0 + ", " + 0.0 + "; " + 0.0 + ", " + 1.0 + "]"); // Start with an empty field
TextField vectorField = new TextField("[" + 0.0 + ", " + 0.0 + "]"); // Start with an empty field
grid.add(matrixField, 0, rowIndex);
grid.add(vectorField, 1, rowIndex);
fieldList.add(new Node[]{matrixField, vectorField});
}
private double[][] parseMatrix(String text) {
text = text.replaceAll("[\\[\\]]", "");
String[] rows = text.split(";");
double[][] matrix = new double[2][2];
for (int i = 0; i < rows.length; i++) {
String[] values = rows[i].split(",");
matrix[i][0] = Double.parseDouble(values[0].trim());
matrix[i][1] = Double.parseDouble(values[1].trim());
}
return matrix;
}
private double[] parseVector(String text) {
text = text.replaceAll("[\\[\\]]", "");
String[] values = text.split(",");
return new double[]{Double.parseDouble(values[0].trim()), Double.parseDouble(values[1].trim())};
}
public void showDialog() {
dialog.showAndWait();
}
}
\ No newline at end of file
package edu.ntnu.idatt2003.mappevurderingprog2.views.Components; package edu.ntnu.idatt2003.mappevurderingprog2.views.Components;
import edu.ntnu.idatt2003.mappevurderingprog2.controllers.GameController;
import edu.ntnu.idatt2003.mappevurderingprog2.views.View;
import javafx.scene.control.Button; import javafx.scene.control.Button;
import javafx.scene.control.Dialog;
import javafx.scene.control.Label; import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.control.ButtonType;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.VBox; import javafx.scene.layout.VBox;
import javafx.geometry.Insets;
import javafx.geometry.Pos; import javafx.geometry.Pos;
public class CreateFractalMenu extends VBox { public class CreateFractalMenu extends VBox {
public CreateFractalMenu() { private GameController gameController;
public CreateFractalMenu(View view, GameController gameController) {
this.gameController = gameController;
Label headline = new Label("Create a new fractal"); Label headline = new Label("Create a new fractal");
headline.setStyle("-fx-font-size: 16px; -fx-font-weight: bold;"); headline.setStyle("-fx-font-size: 16px; -fx-font-weight: bold;");
Button affineButton = new Button("Affine"); Button affineButton = new Button("Affine");
Button juliaButton = new Button("Julia"); affineButton.setOnAction(event -> {
AffineDialog affineDialog = new AffineDialog(gameController, false);
affineDialog.showDialog();
});
affineButton.setOnAction(e -> showAffineDialog()); Button juliaButton = new Button("Julia");
juliaButton.setOnAction(e -> showJuliaDialog()); juliaButton.setOnAction(event -> {
JuliaDialog juliaDialog = new JuliaDialog(gameController, false);
juliaDialog.showDialog();
});
getChildren().addAll(headline, affineButton, juliaButton); getChildren().addAll(headline, affineButton, juliaButton);
setAlignment(Pos.TOP_CENTER); setAlignment(Pos.TOP_CENTER);
setSpacing(10); setSpacing(10);
} }
private void showAffineDialog() {
Dialog<Void> dialog = new Dialog<>();
dialog.setTitle("Affine Transformation");
GridPane grid = new GridPane();
grid.setHgap(10);
grid.setVgap(10);
grid.setPadding(new Insets(20, 150, 10, 10));
TextField nameField = new TextField();
nameField.setPromptText("Name of the fractal");
TextField matrixField = new TextField();
matrixField.setPromptText("Type in the matrix");
TextField vectorField = new TextField();
vectorField.setPromptText("Type in the vector");
Button addTransformationButton = new Button("Add transformation");
Button saveButton = new Button("Save fractal");
Button createButton = new Button("Create fractal");
grid.add(new Label("Fractal Name:"), 0, 0);
grid.add(nameField, 1, 0);
grid.add(new Label("Matrix:"), 0, 1);
grid.add(matrixField, 1, 1);
grid.add(new Label("Vector:"), 0, 2);
grid.add(vectorField, 1, 2);
grid.add(addTransformationButton, 1, 3);
grid.add(saveButton, 0, 4);
grid.add(createButton, 1, 4);
dialog.getDialogPane().setContent(grid);
dialog.getDialogPane().getButtonTypes().add(ButtonType.CLOSE);
dialog.showAndWait();
}
private void showJuliaDialog() {
Dialog<Void> dialog = new Dialog<>();
dialog.setTitle("Julia Set");
GridPane grid = new GridPane();
grid.setHgap(10);
grid.setVgap(10);
grid.setPadding(new Insets(20, 150, 10, 10));
TextField nameField = new TextField();
nameField.setPromptText("Name of the fractal");
TextField realField = new TextField();
realField.setPromptText("Type in the real part");
TextField imagField = new TextField();
imagField.setPromptText("Type in the imaginary part");
Button saveButton = new Button("Save fractal");
Button createButton = new Button("Create fractal");
grid.add(new Label("Fractal Name:"), 0, 0);
grid.add(nameField, 1, 0);
grid.add(new Label("Real Part:"), 0, 1);
grid.add(realField, 1, 1);
grid.add(new Label("Imaginary Part:"), 0, 2);
grid.add(imagField, 1, 2);
grid.add(saveButton, 0, 3);
grid.add(createButton, 1, 3);
dialog.getDialogPane().setContent(grid);
dialog.getDialogPane().getButtonTypes().add(ButtonType.CLOSE);
dialog.showAndWait();
}
} }
package edu.ntnu.idatt2003.mappevurderingprog2.views.Components; package edu.ntnu.idatt2003.mappevurderingprog2.views.Components;
import edu.ntnu.idatt2003.mappevurderingprog2.controllers.GameController; import edu.ntnu.idatt2003.mappevurderingprog2.controllers.GameController;
import edu.ntnu.idatt2003.mappevurderingprog2.models.AffineTransform2D;
import edu.ntnu.idatt2003.mappevurderingprog2.models.Matrix2x2;
import edu.ntnu.idatt2003.mappevurderingprog2.models.Transform2D;
import edu.ntnu.idatt2003.mappevurderingprog2.models.Vector2D;
import edu.ntnu.idatt2003.mappevurderingprog2.views.View; import edu.ntnu.idatt2003.mappevurderingprog2.views.View;
import java.util.List;
import javafx.scene.control.Button; import javafx.scene.control.Button;
import javafx.scene.control.ButtonType;
import javafx.scene.control.Dialog;
import javafx.scene.control.Label; import javafx.scene.control.Label;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.VBox; import javafx.scene.layout.VBox;
import javafx.geometry.Insets;
import javafx.geometry.Pos; import javafx.geometry.Pos;
public class EditFractalMenu extends VBox { public class EditFractalMenu extends VBox {
GameController gameController; private GameController gameController;
public EditFractalMenu(View view, GameController gameController) { public EditFractalMenu(View view, GameController gameController) {
this.gameController = gameController; this.gameController = gameController;
Label editLabel = new Label("Edit current fractal"); Label editLabel = new Label("Edit current fractal");
...@@ -28,11 +17,12 @@ public class EditFractalMenu extends VBox { ...@@ -28,11 +17,12 @@ public class EditFractalMenu extends VBox {
Button editButton = new Button("Edit"); Button editButton = new Button("Edit");
editButton.setOnAction(event -> { editButton.setOnAction(event -> {
if (gameController.isJuliaTransformation()) { if (gameController.isJuliaTransformation()) {
showJuliaDialog(); JuliaDialog juliaDialog = new JuliaDialog(gameController, true);
juliaDialog.showDialog();
} else if (gameController.isAffineTransformation()) { } else if (gameController.isAffineTransformation()) {
showAffineDialog(); AffineDialog affineDialog = new AffineDialog(gameController, true);
affineDialog.showDialog();
} else { } else {
// Handle the case where there is no transformation
System.out.println("No existing transformation to edit."); System.out.println("No existing transformation to edit.");
} }
}); });
...@@ -41,168 +31,4 @@ public class EditFractalMenu extends VBox { ...@@ -41,168 +31,4 @@ public class EditFractalMenu extends VBox {
setAlignment(Pos.TOP_CENTER); setAlignment(Pos.TOP_CENTER);
setSpacing(10); setSpacing(10);
} }
private void showJuliaDialog() {
Dialog<Void> dialog = new Dialog<>();
dialog.setTitle("Edit Julia Set");
GridPane grid = setupCommonFields();
addJuliaSpecificFields(grid);
dialog.getDialogPane().setContent(grid);
dialog.getDialogPane().getButtonTypes().add(ButtonType.CLOSE);
dialog.showAndWait();
}
private void showAffineDialog() {
Dialog<Void> dialog = new Dialog<>();
dialog.setTitle("Edit Affine Transformation");
GridPane grid = setupCommonFields();
addAffineSpecificFields(grid);
dialog.getDialogPane().setContent(grid);
dialog.getDialogPane().getButtonTypes().add(ButtonType.CLOSE);
dialog.showAndWait();
}
private GridPane setupCommonFields() {
GridPane grid = new GridPane();
grid.setHgap(10);
grid.setVgap(10);
grid.setPadding(new Insets(20, 150, 10, 10));
TextField stepsField = new TextField();
stepsField.setText(String.valueOf(gameController.getCurrentSteps()));
grid.add(new Label("Number of Steps:"), 0, 0);
grid.add(stepsField, 1, 0);
TextField minCoordsFieldX = new TextField();
TextField minCoordsFieldY = new TextField();
minCoordsFieldX.setText(String.valueOf(gameController.getCurrentMinCoords().getX0()));
minCoordsFieldY.setText(String.valueOf(gameController.getCurrentMinCoords().getX1()));
grid.add(new Label("Min Coordinates X:"), 0, 1);
grid.add(minCoordsFieldX, 1, 2);
grid.add(new Label("Min Coordinates Y:"), 2, 1);
grid.add(minCoordsFieldY, 3, 2);
TextField maxCoordsFieldX = new TextField();
TextField maxCoordsFieldY = new TextField();
maxCoordsFieldX.setText(String.valueOf(gameController.getCurrentMaxCoords().getX0()));
maxCoordsFieldY.setText(String.valueOf(gameController.getCurrentMaxCoords().getX1()));
grid.add(new Label("Max Coordinates X:"), 0, 2);
grid.add(maxCoordsFieldX, 1, 1);
grid.add(new Label("Max Coordinates Y:"), 2, 2);
grid.add(maxCoordsFieldY, 3, 1);
return grid;
}
private void addJuliaSpecificFields(GridPane grid) {
TextField realField = new TextField();
realField.setText(String.valueOf(gameController.getCurrentJuliaPoint().getRealPart()));
grid.add(new Label("Real Part:"), 0, 3);
grid.add(realField, 1, 3);
TextField imagField = new TextField();
imagField.setText(String.valueOf(gameController.getCurrentJuliaPoint().getImaginaryPart()));
grid.add(new Label("Imaginary Part:"), 0, 4);
grid.add(imagField, 1, 4);
Button editButton = new Button("Edit Fractal");
grid.add(editButton, 1, 5);
}
private void addAffineSpecificFields(GridPane grid) {
// Add a button for editing transformations instead of direct text fields for matrix and vector
Button editTransformationsButton = new Button("Edit Transformations");
editTransformationsButton.setOnAction(event -> {
showTransformationEditDialog();
});
grid.add(new Label("Transformations:"), 0, 3);
grid.add(editTransformationsButton, 1, 3, 2, 1); // Spanning two columns for better layout
// Button to submit changes to the fractal
Button editButton = new Button("Edit Fractal");
grid.add(editButton, 1, 4);
}
private void showTransformationEditDialog() {
Dialog<Void> dialog = new Dialog<>();
dialog.setTitle("Edit Affine Transformations");
GridPane transformationGrid = new GridPane();
transformationGrid.setHgap(10);
transformationGrid.setVgap(10);
transformationGrid.setPadding(new Insets(20, 150, 10, 10));
// A ScrollPane that will contain the GridPane
ScrollPane scrollPane = new ScrollPane();
scrollPane.setContent(transformationGrid);
scrollPane.setFitToWidth(true); // Ensures the GridPane width fits the scroll pane
scrollPane.setVbarPolicy(ScrollPane.ScrollBarPolicy.AS_NEEDED); // Vertical scrollbar when needed
scrollPane.setHbarPolicy(ScrollPane.ScrollBarPolicy.AS_NEEDED); // Horizontal scrollbar when needed
updateGrid(transformationGrid); // Call to populate the grid initially
dialog.getDialogPane().setContent(scrollPane); // Set the scroll pane as the content of the dialog
dialog.getDialogPane().getButtonTypes().add(ButtonType.CLOSE);
dialog.showAndWait();
}
private void updateGrid(GridPane grid) {
grid.getChildren().clear(); // Clear existing content
List<Transform2D> transformations = gameController.getAffineTransformations();
int row = 0;
for (Transform2D transform : transformations) {
if (transform instanceof AffineTransform2D) {
addMatrixAndVectorFields(grid, (AffineTransform2D) transform, row);
row += 3; // Adjust for matrix, vector, and separator
}
}
// Always add buttons at the end
addControlButtons(grid, row);
}
private void addMatrixAndVectorFields(GridPane grid, AffineTransform2D transform, int row) {
Matrix2x2 matrix = transform.getMatrix();
Vector2D vector = transform.getVector();
grid.addRow(row, new Label("Matrix:"), new TextField(String.valueOf(matrix.getA00())),
new TextField(String.valueOf(matrix.getA01())), new TextField(String.valueOf(matrix.getA10())),
new TextField(String.valueOf(matrix.getA11())));
row++;
grid.addRow(row, new Label("Vector:"), new TextField(String.valueOf(vector.getX0())),
new TextField(String.valueOf(vector.getX1())));
row++;
grid.addRow(row, new Label("------------"));
}
private void addControlButtons(GridPane grid, int row) {
Button addBtn = new Button("Add Transformation");
addBtn.setOnAction(e -> addTransformation(grid));
Button removeBtn = new Button("Remove Transformation");
removeBtn.setOnAction(e -> removeTransformation(grid));
grid.addRow(row, addBtn, removeBtn);
}
private void addTransformation(GridPane grid) {
// Assume default values for new transformation
AffineTransform2D newTransform = new AffineTransform2D(new Matrix2x2(1, 0, 0, 1), new Vector2D(0, 0));
gameController.getAffineTransformations().add(newTransform);
updateGrid(grid); // Rebuild the grid with the new transformation
}
private void removeTransformation(GridPane grid) {
List<Transform2D> transformations = gameController.getAffineTransformations();
if (!transformations.isEmpty()) {
transformations.remove(transformations.size() - 1);
updateGrid(grid); // Rebuild the grid after removal
}
}
} }
package edu.ntnu.idatt2003.mappevurderingprog2.views.Components;
import edu.ntnu.idatt2003.mappevurderingprog2.controllers.GameController;
import edu.ntnu.idatt2003.mappevurderingprog2.models.Complex;
import edu.ntnu.idatt2003.mappevurderingprog2.models.Vector2D;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonType;
import javafx.scene.control.Dialog;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.geometry.Insets;
public class JuliaDialog {
private Dialog<Void> dialog;
private GameController gameController;
private boolean isEditMode;
public JuliaDialog(GameController gameController, boolean isEditMode) {
this.gameController = gameController;
this.isEditMode = isEditMode;
setupDialog();
}
private void setupDialog() {
dialog = new Dialog<>();
dialog.setTitle(isEditMode ? "Edit Julia Set" : "Create Julia Set");
GridPane grid = new GridPane();
grid.setHgap(10);
grid.setVgap(10);
grid.setPadding(new Insets(20, 150, 10, 10));
TextField stepsField = new TextField(isEditMode ? String.valueOf(gameController.getCurrentSteps()) : "");
grid.add(new Label("Number of Steps:"), 0, 0);
grid.add(stepsField, 1, 0);
TextField minCoordsFieldX = new TextField(isEditMode ? String.valueOf(gameController.getCurrentMinCoords().getX0()) : "");
TextField minCoordsFieldY = new TextField(isEditMode ? String.valueOf(gameController.getCurrentMinCoords().getX1()) : "");
grid.add(new Label("Min Coordinates X:"), 0, 1);
grid.add(minCoordsFieldX, 1, 1);
grid.add(new Label("Min Coordinates Y:"), 2, 1);
grid.add(minCoordsFieldY, 3, 1);
TextField maxCoordsFieldX = new TextField(isEditMode ? String.valueOf(gameController.getCurrentMaxCoords().getX0()) : "");
TextField maxCoordsFieldY = new TextField(isEditMode ? String.valueOf(gameController.getCurrentMaxCoords().getX1()) : "");
grid.add(new Label("Max Coordinates X:"), 0, 2);
grid.add(maxCoordsFieldX, 1, 2);
grid.add(new Label("Max Coordinates Y:"), 2, 2);
grid.add(maxCoordsFieldY, 3, 2);
TextField realField = new TextField(isEditMode && gameController.getCurrentJuliaPoint() != null ? String.valueOf(gameController.getCurrentJuliaPoint().getRealPart()) : "");
grid.add(new Label("Real Part:"), 0, 3);
grid.add(realField, 1, 3);
TextField imagField = new TextField(isEditMode && gameController.getCurrentJuliaPoint() != null ? String.valueOf(gameController.getCurrentJuliaPoint().getImaginaryPart()) : "");
grid.add(new Label("Imaginary Part:"), 0, 4);
grid.add(imagField, 1, 4);
Button editButton = new Button(isEditMode ? "Edit Fractal" : "Create Fractal");
editButton.setOnAction(event -> handleAction(stepsField, minCoordsFieldX, minCoordsFieldY, maxCoordsFieldX, maxCoordsFieldY, realField, imagField));
grid.add(editButton, 1, 5);
dialog.getDialogPane().setContent(grid);
dialog.getDialogPane().getButtonTypes().add(ButtonType.CLOSE);
}
private void handleAction(TextField stepsField, TextField minCoordsFieldX, TextField minCoordsFieldY, TextField maxCoordsFieldX, TextField maxCoordsFieldY, TextField realField, TextField imagField) {
try {
int steps = Integer.parseInt(stepsField.getText());
double minX = Double.parseDouble(minCoordsFieldX.getText());
double minY = Double.parseDouble(minCoordsFieldY.getText());
double maxX = Double.parseDouble(maxCoordsFieldX.getText());
double maxY = Double.parseDouble(maxCoordsFieldY.getText());
double real = Double.parseDouble(realField.getText());
double imag = Double.parseDouble(imagField.getText());
Complex newPoint = new Complex(real, imag);
gameController.setChaosGameSteps(steps);
gameController.setJuliaTransformation(newPoint, new Vector2D(minX, minY), new Vector2D(maxX, maxY));
gameController.setChaosCanvasSize(200, 200);
gameController.runTransformation();
dialog.close();
} catch (NumberFormatException e) {
System.out.println("Invalid input for complex number.");
}
}
public void showDialog() {
dialog.showAndWait();
}
}
...@@ -15,7 +15,7 @@ public class Menu extends VBox { ...@@ -15,7 +15,7 @@ public class Menu extends VBox {
public Menu(View view, GameController gameController) { public Menu(View view, GameController gameController) {
existingFractalsMenu = new ExistingFractalsMenu(view, gameController); existingFractalsMenu = new ExistingFractalsMenu(view, gameController);
createFractalMenu = new CreateFractalMenu(); createFractalMenu = new CreateFractalMenu(view, gameController);
editFractalMenu = new EditFractalMenu(view, gameController); editFractalMenu = new EditFractalMenu(view, gameController);
extraUserOptions = new ExtraUserOptions(view.getMainCanvas()); extraUserOptions = new ExtraUserOptions(view.getMainCanvas());
initializeMenu(); initializeMenu();
......
...@@ -20,7 +20,7 @@ public abstract class TransformationButton extends Button { ...@@ -20,7 +20,7 @@ public abstract class TransformationButton extends Button {
private GameController gameController; private GameController gameController;
public TransformationButton(String label, GameController gameController, View view, Canvas transformationCanvas, ChaosGameDescription chaosGameDescription, int height, int width) { public TransformationButton(String label, GameController gameController, View view, Canvas transformationCanvas, ChaosGameDescription chaosGameDescription, int height, int width) {
super(label); // Sets the label of the button super(label);
this.gameController = gameController; this.gameController = gameController;
this.view = view; this.view = view;
this.transformationCanvas = transformationCanvas; this.transformationCanvas = transformationCanvas;
...@@ -34,6 +34,6 @@ public abstract class TransformationButton extends Button { ...@@ -34,6 +34,6 @@ public abstract class TransformationButton extends Button {
gameController.setChaosGameDescription(chaosGameDescription); gameController.setChaosGameDescription(chaosGameDescription);
gameController.setChaosCanvasSize(width, height); gameController.setChaosCanvasSize(width, height);
gameController.runTransformation(); gameController.runTransformation();
});// Set the action on button press });
} }
} }
...@@ -2,6 +2,7 @@ package edu.ntnu.idatt2003.mappevurderingprog2.views; ...@@ -2,6 +2,7 @@ package edu.ntnu.idatt2003.mappevurderingprog2.views;
import edu.ntnu.idatt2003.mappevurderingprog2.controllers.GameController; import edu.ntnu.idatt2003.mappevurderingprog2.controllers.GameController;
import edu.ntnu.idatt2003.mappevurderingprog2.views.Components.ExtraUserOptions; import edu.ntnu.idatt2003.mappevurderingprog2.views.Components.ExtraUserOptions;
import edu.ntnu.idatt2003.mappevurderingprog2.views.Components.JuliaDialog;
import edu.ntnu.idatt2003.mappevurderingprog2.views.Components.Menu; import edu.ntnu.idatt2003.mappevurderingprog2.views.Components.Menu;
import edu.ntnu.idatt2003.mappevurderingprog2.views.Components.Zoom; import edu.ntnu.idatt2003.mappevurderingprog2.views.Components.Zoom;
import edu.ntnu.idatt2003.mappevurderingprog2.models.chaos.ChaosCanvas; import edu.ntnu.idatt2003.mappevurderingprog2.models.chaos.ChaosCanvas;
...@@ -23,7 +24,6 @@ import javafx.scene.layout.*; ...@@ -23,7 +24,6 @@ import javafx.scene.layout.*;
import javafx.scene.paint.Color; import javafx.scene.paint.Color;
public class View extends BorderPane implements ChaosGameObserver { public class View extends BorderPane implements ChaosGameObserver {
private Canvas mainCanvas; private Canvas mainCanvas;
private GameController gameController; private GameController gameController;
private Menu menu; private Menu menu;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment