Skip to content
Snippets Groups Projects
Commit b37c71b1 authored by Guyslain's avatar Guyslain
Browse files

update du sujet, 2024

parent 3f26fd43
No related branches found
No related tags found
No related merge requests found
Showing
with 235 additions and 220 deletions
package controller;
import datastruct.Coordinate;
import matrix.Coordinate;
import javafx.animation.Animation;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
......@@ -11,7 +11,6 @@ import javafx.scene.control.Label;
import javafx.scene.control.ToggleButton;
import javafx.scene.control.ToggleGroup;
import javafx.util.Duration;
import model.CellularAutomatonSimulation;
import view.MatrixPane;
import static java.util.Objects.requireNonNull;
......
package controller;
import datastruct.Coordinate;
import matrix.Coordinate;
import javafx.scene.paint.Color;
import model.OnChangeListener;
......
package datastruct;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* Represents a matrix, a rectangular array, with generic values in each cell.
*
* @param <T> The type of values stored in the matrix cells.
*/
public class Matrix<T> implements Iterable<T> {
private final List<List<T>> matrix;
private final int width;
private final int height;
/**
* Creates a new {@link Matrix} with the specified width, height, and an initializer to set
* values.
*
* @param width The width of the {@link Matrix}.
* @param height The height of the {@link Matrix}.
* @param initializer A matrix initializer to set values in the {@link Matrix}.
*/
public Matrix(int width, int height, MatrixInitializer<T> initializer) {
this.width = width;
this.height = height;
this.matrix = new ArrayList<>();
this.initializeWith(initializer);
}
/**
* Creates a new {@link Matrix} with the specified width, height, and initial value for all
* cells.
*
* @param width The width of the {@link Matrix}.
* @param height The height of the {@link Matrix}.
* @param initialValue The initial value to set in all cells of the {@link Matrix}.
*/
public Matrix(int width, int height, T initialValue) {
this(width, height, new ConstantMatrixInitializer<>(initialValue));
}
private void initializeWith(MatrixInitializer<T> initializer) {
for (int x = 0; x < width; x++) {
List<T> row = new ArrayList<>();
this.matrix.add(row);
for (int y = 0; y < height; y++) {
row.add(initializer.initialValueAt(Coordinate.of(x, y)));
}
}
}
/**
* Returns the width of the {@link Matrix}.
*
* @return The width of the {@link Matrix}.
*/
public int width() {
return width;
}
/**
* Returns the height of the {@link Matrix}.
*
* @return The height of the {@link Matrix}.
*/
public int height() {
return height;
}
/**
* Gets the value at the specified coordinates (x, y) in the {@link Matrix}.
*
* @param x The x-coordinate.
* @param y The y-coordinate.
* @return The value at the specified coordinates.
*/
public T get(int x, int y) {
return this.matrix.get(x).get(y);
}
/**
* Gets the value at the specified {@link Coordinate} in the {@link Matrix}.
*
* @param coordinate The {@link Coordinate}.
* @return The value at the specified {@link Coordinate}.
*/
public T get(Coordinate coordinate) {
return this.get(coordinate.x(), coordinate.y());
}
/**
* Sets the value at the specified coordinates (x, y) in the {@link Matrix}.
*
* @param x The x-coordinate.
* @param y The y-coordinate.
* @param value The value to set at the specified coordinates.
*/
public void set(int x, int y, T value) {
this.matrix.get(x).set(y, value);
}
/**
* Sets the value at the specified {@link Coordinate} in the {@link Matrix}.
*
* @param coordinate The {@link Coordinate}.
* @param value The value to set at the specified {@link Coordinate}.
*/
public void set(Coordinate coordinate, T value) {
this.set(coordinate.x(), coordinate.y(), value);
}
/**
* Returns an {@link Iterator} that allows iterating over the elements in the {@link Matrix} in
* row-major order.
*
* @return An {@link Iterator} for the {@link Matrix}.
*/
public Iterator<T> iterator() {
Iterator<Coordinate> coordIterator = this.coordinatesIterator();
return new MatrixIterator<>(this, coordIterator);
}
/**
* Returns an {@link Iterable} that provides access to the {@link Coordinate}s of the
* {@link Matrix} in row-major order. This means that a {@code for} loop on a {@link Matrix}
* will loop over the coordinates of the {@link Matrix}.
*
* @return An {@link Iterable} for the {@link Coordinate}s of the {@link Matrix}.
*/
public Iterable<Coordinate> coordinates() {
return this::coordinatesIterator;
}
/**
* Returns an {@link Iterator} that allows iterating over the {@link Coordinate}s in the
* {@link Matrix} in row-major order.
*
* @return An {@link Iterator} for the {@link Matrix}.
*/
private Iterator<Coordinate> coordinatesIterator() {
return new CoordinateIterator(this.width, this.height);
}
/**
* Returns a lens for accessing and modifying the value at the specified coordinates (x, y) in
* the {@link Matrix}.
*
* @param x The x-coordinate.
* @param y The y-coordinate.
* @return A lens for the specified coordinates.
*/
public Lens<T> at(int x, int y) {
return new Lens<T>() {
@Override
public T get() {
return Matrix.this.get(x, y);
}
@Override
public void set(T value) {
Matrix.this.set(x, y, value);
}
};
}
/**
* Returns a lens for accessing and modifying the value at the specified coordinate in the
* {@link Matrix}.
*
* @param coordinate The {@link Coordinate}.
* @return A lens for the specified {@link Coordinate}.
*/
public Lens<T> at(Coordinate coordinate) {
return this.at(coordinate.x(), coordinate.y());
}
}
package datastruct;
package matrix;
public class ConstantMatrixInitializer<T> implements MatrixInitializer<T> {
private final T constant;
// TODO: add instance variables
public ConstantMatrixInitializer(T constant) {
// TODO
}
public ConstantMatrixInitializer(T constant) {
this.constant = constant;
}
@Override
public T initialValueAt(Coordinate coordinate) {
return constant;
// TODO
return null;
}
}
package datastruct;
package matrix;
import java.util.ArrayList;
import java.util.List;
/**
......@@ -62,7 +61,15 @@ public record Coordinate(int x, int y) {
/**
* Computes and returns a list of orthogonal (adjacent in horizontal or vertical direction) neighbors.
*
* | | | |
* ---------
* | |X| |
* ---------
* |X|O|X|
* ---------
* | |X| |
* ---------
* | | | |
* @return A list of orthogonal neighboring {@link Coordinate}s.
*/
public List<Coordinate> orthogonalNeighbours() {
......@@ -72,6 +79,15 @@ public record Coordinate(int x, int y) {
/**
* Computes and returns a list of diagonal (adjacent in diagonal direction) neighbors.
* | | | |
* ---------
* |X| |X|
* ---------
* | |O| |
* ---------
* |X| |X|
* ---------
* | | | |
*
* @return A list of diagonal neighboring {@link Coordinate}s.
*/
......@@ -82,6 +98,15 @@ public record Coordinate(int x, int y) {
/**
* Computes and returns a list of all orthogonal and diagonal neighbors.
* * | | | |
* * ---------
* * |X|X|X|
* * ---------
* * |X|O|X|
* * ---------
* * |X|X|X|
* * ---------
* * | | | |
*
* @return A list of all neighboring {@link Coordinate}s.
*/
......@@ -94,4 +119,12 @@ public record Coordinate(int x, int y) {
public String toString() {
return "(" + this.x + "," + this.y + ")";
}
public Coordinate minus(Coordinate corner) {
return new Coordinate(this.x - corner.x, this.y - corner.y);
}
public Coordinate plus(Coordinate corner) {
return new Coordinate(this.x + corner.x, this.y + corner.y);
}
}
\ No newline at end of file
package datastruct;
package matrix;
import java.util.Iterator;
import java.util.NoSuchElementException;
......
package matrix;
import java.util.List;
/**
* Represents a matrix, a rectangular array, with generic values in each cell.
*
* @param <T> The type of values stored in the matrix cells.
*/
public class ListMatrix<T> implements Matrix<T> {
private final List<List<T>> matrix;
private final int width;
private final int height;
/**
* Creates a new {@link ListMatrix} with the specified width, height, and an initializer to set
* values.
*
* @param width The width of the {@link ListMatrix}.
* @param height The height of the {@link ListMatrix}.
* @param initializer A matrix initializer to set values in the {@link ListMatrix}.
*/
public ListMatrix(int width, int height, MatrixInitializer<T> initializer) {
// TODO
this.width = 0;
this.height = 0;
this.matrix = null;
this.initializeWith(initializer); // fills the matrix using initializer
}
public ListMatrix(int width, int height, T constant) {
this(width, height, new ConstantMatrixInitializer<>(constant));
}
private void initializeWith(MatrixInitializer<T> initializer) {
// TODO initialize each cell of the matrix, with a value determined by initializer
}
public int width() {
// TODO
return 0;
}
public int height() {
// TODO
return 0;
}
@Override
public T get(int x, int y) {
// TODO
return null;
}
@Override
public void set(int x, int y, T newValue) {
// TODO
}
public Matrix<T> subMatrix(Coordinate corner, int width, int height) {
// TODO
return this;
}
}
package matrix;
import java.util.Iterator;
public interface Matrix<T> extends Iterable<T> {
/**
* Returns the width of the {@link Matrix}.
*
* @return The width of the {@link Matrix}.
*/
int width();
/**
* Returns the height of the {@link Matrix}.
*
* @return The height of the {@link Matrix}.
*/
int height();
/**
* Returns the value at the specified coordinates (x, y) in
* the {@link Matrix}.
*
* @param x The x-coordinate.
* @param y The y-coordinate.
* @return The content of the matrix at the coordinates (x,y).
*/
T get(int x, int y);
/**
* Returns the value at the specified coordinates (x, y) in
* the {@link Matrix}.
*
* @param coordinate The coordinates (x,y).
* @return The content of the matrix at the coordinates (x,y).
*/
default T get(Coordinate coordinate) {
return this.get(coordinate.x(), coordinate.y());
}
/**
* Changes the value at the specified coordinates (x,y) in the {@link Matrix}
*
* @param x the x-coordinate
* @param y the y-coordinate
* @param newValue the value to assign to coordinates (x,y).
*/
void set(int x, int y, T newValue);
/**
* Changes the value at the specified coordinates (x,y) in the {@link Matrix}
*
* @param coordinate The coordinates (x,y)
* @param newValue the value to assign to coordinates (x,y).
*/
default void set(Coordinate coordinate, T newValue) {
this.set(coordinate.x(), coordinate.y(), newValue);
}
Matrix<T> subMatrix(Coordinate corner, int width, int height);
/**
* Returns an {@link Iterable} that provides access to the {@link Coordinate}s of the
* {@link Matrix} in row-major order. This means that a {@code for} loop on a {@link Matrix}
* will loop over the coordinates of the {@link Matrix}.
*
* @return An {@link Iterable} for the {@link Coordinate}s of the {@link Matrix}.
*/
default Iterable<Coordinate> coordinates() {
return () -> new CoordinateIterator(this.width(), this.height());
}
/**
* Returns an {@link Iterator} that allows iterating over the elements in the {@link Matrix} in
* row-major order.
*
* @return An {@link Iterator} for the {@link Matrix}.
*/
default Iterator<T> iterator() {
Iterator<Coordinate> coords =
new CoordinateIterator(this.width(),this.height());
return new MatrixIterator<>(this, coords);
}
}
package datastruct;
package matrix;
/**
* An interface for initializing a {@link Matrix} by providing initial values for each cell.
* An interface for initializing a {@link ListMatrix} by providing initial values for each cell.
*
* @param <T> The type of values to initialize the {@link Matrix} with.
* @param <T> The type of values to initialize the {@link ListMatrix} with.
*/
public interface MatrixInitializer<T> {
/**
* Returns the initial value to be set in a {@link Matrix} cell at the specified
* Returns the initial value to be set in a {@link ListMatrix} cell at the specified
* {@link Coordinate}.
*
* @param coordinate The {@link Coordinate} at which to set the initial value.
......
package datastruct;
package matrix;
import java.util.Iterator;
import java.util.NoSuchElementException;
......
package model;
import datastruct.Lens;
import java.util.ArrayList;
import java.util.List;
......
package model;
import controller.Simulation;
import datastruct.Coordinate;
import datastruct.Matrix;
import matrix.Coordinate;
import matrix.ListMatrix;
import javafx.scene.paint.Color;
import java.util.Iterator;
......@@ -18,7 +18,7 @@ import java.util.Random;
public class CellularAutomatonSimulation<S extends State<S>>
implements Simulation {
private final Matrix<Cell<S>> grid;
private final ListMatrix<Cell<S>> grid;
private final Cell<Integer> generationNumber = new Cell<>(0);
private final CellularAutomaton<S> automaton;
private final Random generator;
......@@ -31,7 +31,7 @@ public class CellularAutomatonSimulation<S extends State<S>>
*/
public CellularAutomatonSimulation(CellularAutomaton<S> automaton, Random generator) {
this.automaton = automaton;
this.grid = new Matrix<>(
this.grid = new ListMatrix<>(
automaton.numberOfColumns(),
automaton.numberOfRows(),
new ConstantCellInitializer<>(automaton.defaultState())
......@@ -68,12 +68,12 @@ public class CellularAutomatonSimulation<S extends State<S>>
//TODO: à compléter, en utilisant nextGenerationMatrix()
}
/** Computes the {@link Matrix} of states obtained after a single step of updates
/** Computes the {@link ListMatrix} of states obtained after a single step of updates
* of the simulation.
*
* @return the states of each cell after one generation
*/
private Matrix<S> nextGenerationMatrix() {
private ListMatrix<S> nextGenerationMatrix() {
//TODO: à compléter
return null;
}
......
package model;
import datastruct.Coordinate;
import datastruct.Matrix;
import datastruct.MatrixInitializer;
import matrix.Coordinate;
import matrix.ListMatrix;
import matrix.MatrixInitializer;
/**
* An initializer for {@link Matrix} of {@link Cell}s, where each cell is initialized to the
* An initializer for {@link ListMatrix} of {@link Cell}s, where each cell is initialized to the
* same value.
*
* @param <T> the type of content of each cell
......
package datastruct;
package model;
/**
* A lens interface representing a view into a mutable state.
......
package model;
import datastruct.Coordinate;
import datastruct.MatrixInitializer;
import datastruct.Matrix;
import matrix.Coordinate;
import matrix.MatrixInitializer;
import matrix.ListMatrix;
import controller.Simulation;
import java.util.ArrayList;
import java.util.List;
/**
* An initializer for a {@link Matrix} of states, where each state is computed based on the value
* An initializer for a {@link ListMatrix} of states, where each state is computed based on the value
* of its neighbours in a {@link Simulation} of a cellular automaton.
*
* @param <S> the type of states in the simulation.
......
package view;
import datastruct.Coordinate;
import matrix.Coordinate;
import javafx.scene.input.MouseEvent;
public class FillingMouseListener implements MouseListener {
......
package view;
import controller.Controller;
import datastruct.Coordinate;
import matrix.Coordinate;
import javafx.scene.input.MouseDragEvent;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.GridPane;
......
package view;
import datastruct.Coordinate;
import matrix.Coordinate;
import javafx.scene.input.MouseEvent;
interface MouseListener {
......
package view;
import datastruct.Coordinate;
import matrix.Coordinate;
import javafx.scene.input.MouseEvent;
class WaitingMouseListener implements MouseListener {
......
package datastruct;
package matrix;
import org.junit.jupiter.api.Test;
......@@ -7,7 +7,7 @@ import static org.junit.jupiter.api.Assertions.*;
class ConstantMatrixInitializerTest {
@Test
public void testMatrixInitializationWithConstantValue() {
Matrix<String> matrix = new Matrix<>(3, 3, new ConstantMatrixInitializer<>("X"));
ListMatrix<String> matrix = new ListMatrix<>(3, 3, new ConstantMatrixInitializer<>("X"));
// Test that all cells have the constant value.
for (int x = 0; x < 3; x++) {
......@@ -19,7 +19,7 @@ class ConstantMatrixInitializerTest {
@Test
public void testMatrixInitializationWithConstantValue2() {
Matrix<Integer> matrix = new Matrix<>(3, 5, new ConstantMatrixInitializer<>(12));
ListMatrix<Integer> matrix = new ListMatrix<>(3, 5, new ConstantMatrixInitializer<>(12));
// Test that all cells have the constant value.
for (int x = 0; x < 3; x++) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment