From 78c69d96e5bd8c2ee34c4b860f4ada2eb7444f3c Mon Sep 17 00:00:00 2001
From: t22007439 <romain.toullec@etu.univ-amu.fr>
Date: Fri, 8 Nov 2024 16:44:22 +0100
Subject: [PATCH] classe matrix

---
 README.md                                     |  2 +-
 .../matrix/ConstantMatrixInitializer.java     | 15 +++--
 src/main/java/matrix/Coordinate.java          | 44 +++++++------
 src/main/java/matrix/CoordinateIterator.java  | 43 +++++--------
 src/main/java/matrix/ListMatrix.java          | 63 +++++++++----------
 5 files changed, 77 insertions(+), 90 deletions(-)

diff --git a/README.md b/README.md
index d8169c8..60e388e 100644
--- a/README.md
+++ b/README.md
@@ -19,5 +19,5 @@ jeu de la vie.
 
 ## Membre du projet
 
-- NOM, prénom, du participant
+- Toullec, Romain, Groupe 1
 
diff --git a/src/main/java/matrix/ConstantMatrixInitializer.java b/src/main/java/matrix/ConstantMatrixInitializer.java
index 88d798b..9481337 100644
--- a/src/main/java/matrix/ConstantMatrixInitializer.java
+++ b/src/main/java/matrix/ConstantMatrixInitializer.java
@@ -1,16 +1,15 @@
 package matrix;
 
 public class ConstantMatrixInitializer<T> implements MatrixInitializer<T> {
-
-  // TODO: add instance variables
+  private final T constant;
 
   public ConstantMatrixInitializer(T constant) {
-    // TODO
+    this.constant = constant;
   }
 
-    @Override
-    public T initialValueAt(Coordinate coordinate) {
-      // TODO
-      return null;
-    }
+  @Override
+  public T initialValueAt(Coordinate coordinate) {
+    return this.constant;
+  }
 }
+
diff --git a/src/main/java/matrix/Coordinate.java b/src/main/java/matrix/Coordinate.java
index f3e5ac0..545b494 100644
--- a/src/main/java/matrix/Coordinate.java
+++ b/src/main/java/matrix/Coordinate.java
@@ -15,8 +15,7 @@ public record Coordinate(int x, int y) {
      * @return A new {@link Coordinate} instance.
      */
     public static Coordinate of(int x, int y) {
-        // TODO: compléter ce fabriquant
-        return null;
+        return new Coordinate(x, y);
     }
 
     /**
@@ -25,8 +24,7 @@ public record Coordinate(int x, int y) {
      * @return The left adjacent {@link Coordinate}.
      */
     public Coordinate left() {
-        // TODO: à compléter
-        return null;
+        return new Coordinate(x - 1, y);
     }
 
     /**
@@ -35,8 +33,7 @@ public record Coordinate(int x, int y) {
      * @return The right adjacent {@link Coordinate}.
      */
     public Coordinate right() {
-        // TODO: à compléter
-        return null;
+        return new Coordinate(x + 1, y);
     }
 
     /**
@@ -45,8 +42,7 @@ public record Coordinate(int x, int y) {
      * @return The above adjacent {@link Coordinate}.
      */
     public Coordinate above() {
-        // TODO: à compléter
-        return null;
+        return new Coordinate(x , y-1);
     }
 
     /**
@@ -55,8 +51,7 @@ public record Coordinate(int x, int y) {
      * @return The below adjacent {@link Coordinate}.
      */
     public Coordinate below() {
-        // TODO: à compléter
-        return null;
+        return new Coordinate(x , y+1);
     }
 
     /**
@@ -73,8 +68,7 @@ public record Coordinate(int x, int y) {
      * @return A list of orthogonal neighboring {@link Coordinate}s.
      */
     public List<Coordinate> orthogonalNeighbours() {
-        // TODO: à compléter
-        return List.of();
+        return List.of(left(), right(), above(), below());
     }
 
     /**
@@ -92,8 +86,11 @@ public record Coordinate(int x, int y) {
      * @return A list of diagonal neighboring {@link Coordinate}s.
      */
     public List<Coordinate> diagonalNeighbours() {
-        // TODO: à compléter
-        return List.of();
+        return List.of(
+                new Coordinate(x - 1, y - 1),
+                new Coordinate(x + 1, y - 1),
+                new Coordinate(x - 1, y + 1),
+                new Coordinate(x + 1, y + 1));
     }
 
     /**
@@ -111,8 +108,9 @@ public record Coordinate(int x, int y) {
      * @return A list of all neighboring {@link Coordinate}s.
      */
     public List<Coordinate> orthodiagonalNeighbours() {
-        // TODO: à compléter
-        return List.of();
+        List<Coordinate> neighbours = orthogonalNeighbours();
+        neighbours.addAll(diagonalNeighbours());
+        return neighbours;
     }
 
     @Override
@@ -120,11 +118,11 @@ public record Coordinate(int x, int y) {
         return "(" + this.x + "," + this.y + ")";
     }
 
-  public Coordinate minus(Coordinate corner) {
-    return new Coordinate(this.x - corner.x, this.y - corner.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
+    public Coordinate plus(Coordinate corner) {
+        return new Coordinate(this.x + corner.x, this.y + corner.y);
+    }
+}
diff --git a/src/main/java/matrix/CoordinateIterator.java b/src/main/java/matrix/CoordinateIterator.java
index 810b712..769d8a0 100644
--- a/src/main/java/matrix/CoordinateIterator.java
+++ b/src/main/java/matrix/CoordinateIterator.java
@@ -3,42 +3,33 @@ package matrix;
 import java.util.Iterator;
 import java.util.NoSuchElementException;
 
-/**
- * An {@link Iterator} for generating 2D {@link Coordinate}s within a specified width and
- * height range.
- */
 class CoordinateIterator implements Iterator<Coordinate> {
+    private final int width;
+    private final int height;
+    private int currentX = 0;
+    private int currentY = 0;
 
-    /**
-     * Creates a new {@link CoordinateIterator} with the specified width and height.
-     *
-     * @param width  The width of the coordinate range.
-     * @param height The height of the coordinate range.
-     */
     public CoordinateIterator(int width, int height) {
-        // TODO: à compléter
+        this.width = width;
+        this.height = height;
     }
 
-    /**
-     * Checks if there are more {@link Coordinate}s to iterate over.
-     *
-     * @return true if there are more {@link Coordinate}s; otherwise, false.
-     */
     @Override
     public boolean hasNext() {
-        // TODO: à compléter
-        return false;
+        return currentY < height;
     }
 
-    /**
-     * Returns the next {@link Coordinate} in the iteration.
-     *
-     * @return The next {@link Coordinate} in the iteration.
-     * @throws NoSuchElementException if there are no more {@link Coordinate}s to iterate over.
-     */
     @Override
     public Coordinate next() {
-        // TODO: à compléter
-        return null;
+        if (!hasNext()) {
+            throw new NoSuchElementException();
+        }
+        Coordinate coord = new Coordinate(currentX, currentY);
+        currentX++;
+        if (currentX >= width) {
+            currentX = 0;
+            currentY++;
+        }
+        return coord;
     }
 }
diff --git a/src/main/java/matrix/ListMatrix.java b/src/main/java/matrix/ListMatrix.java
index a3a4e7d..ff7e031 100644
--- a/src/main/java/matrix/ListMatrix.java
+++ b/src/main/java/matrix/ListMatrix.java
@@ -1,63 +1,62 @@
 package matrix;
 
+import java.util.ArrayList;
 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
+    this.width = width;
+    this.height = height;
+    matrix = new ArrayList<>(height);
+    for (int y = 0; y < height; y++) {
+      List<T> row = new ArrayList<>(width);
+      for (int x = 0; x < width; x++) {
+        row.add(initializer.initialValueAt(new Coordinate(x, y)));
+      }
+      matrix.add(row);
+    }
   }
 
   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
-  }
-
+  @Override
   public int width() {
-    // TODO
-    return 0;
+    return width;
   }
 
+  @Override
   public int height() {
-    // TODO
-    return 0;
+    return height;
   }
 
   @Override
   public T get(int x, int y) {
-    // TODO
-    return null;
+    return matrix.get(y).get(x);
   }
 
-
   @Override
   public void set(int x, int y, T newValue) {
-    // TODO
+    matrix.get(y).set(x, newValue);
   }
 
+  @Override
+  public T get(Coordinate coordinate) {
+    return get(coordinate.x(), coordinate.y());
+  }
+
+  @Override
+  public void set(Coordinate coordinate, T newValue) {
+    set(coordinate.x(), coordinate.y(), newValue);
+  }
+
+  @Override
+  public Matrix<T> subMatrix(Coordinate corner, int subWidth, int subHeight) {
+    return new ListMatrix<>(subWidth, subHeight, new SubMatrixInitializer<>(this, corner));
+  }
 }
-- 
GitLab