summaryrefslogtreecommitdiff
path: root/c2/mondrian/Mondrian.java
diff options
context:
space:
mode:
Diffstat (limited to 'c2/mondrian/Mondrian.java')
-rw-r--r--c2/mondrian/Mondrian.java97
1 files changed, 97 insertions, 0 deletions
diff --git a/c2/mondrian/Mondrian.java b/c2/mondrian/Mondrian.java
new file mode 100644
index 0000000..398a60e
--- /dev/null
+++ b/c2/mondrian/Mondrian.java
@@ -0,0 +1,97 @@
+import java.awt.*;
+import java.util.Random;
+
+public class Mondrian {
+
+ private int canvasWidth;
+ private int canvasHeight;
+ private static final int MIN_REGION_SIZE = 10;
+ private Random rand;
+
+ public void paintBasicMondrian(Color[][] pixels) {
+ rand = new Random();
+ int width = pixels[0].length;
+ int height = pixels.length;
+ this.canvasWidth = width;
+ this.canvasHeight = height;
+
+ divideCanvas(pixels, 0, width, 0, height);
+ }
+
+ public void paintComplexMondrian(Color[][] pixels) {
+
+ }
+
+ private void divideCanvas(Color[][] pixels, int x1, int x2, int y1, int y2) {
+ if (x2 - x1 >= MIN_REGION_SIZE * 3 && y2 - y1 >= MIN_REGION_SIZE * 3) {
+ //int hSplit = (x2 - x1) / 2 + x1;
+ //int vSplit = (y2 - y1) / 2 + y1;
+
+ int hSplit = rand.nextInt(x1+1, x2-10);
+ int vSplit = rand.nextInt(y1+1, y2-10);
+
+ //if (x2 - x1 >= canvasWidth / 4) {
+ //int rangeX = (x2 - x1 - MIN_REGION_SIZE * 2) / MIN_REGION_SIZE;
+ // hSplit = rand.nextInt(rangeX) * MIN_REGION_SIZE + x1 + MIN_REGION_SIZE;
+ // hSplit = Math.min(hSplit, x2 - MIN_REGION_SIZE); // Ensure hSplit is within canvas bounds
+ // hSplit = Math.max(hSplit, x1 + MIN_REGION_SIZE); // Ensure hSplit is at least MIN_REGION_SIZE away from the canvas edge
+ //}
+
+ //if (y2 - y1 >= canvasHeight / 4) {
+ // int rangeY = (y2 - y1 - MIN_REGION_SIZE * 2) / MIN_REGION_SIZE;
+ // vSplit = rand.nextInt(rangeY) * MIN_REGION_SIZE + y1 + MIN_REGION_SIZE;
+ // vSplit = Math.min(vSplit, y2 - MIN_REGION_SIZE); // Ensure vSplit is within canvas bounds
+ // vSplit = Math.max(vSplit, y1 + MIN_REGION_SIZE); // Ensure vSplit is at least MIN_REGION_SIZE away from the canvas edge
+ //}
+
+ //// Additional constraints for the horizontal splitting points to prevent rectangles wider than canvasWidth/4
+ //if (x2 - x1 >= canvasWidth / 4) {
+ // hSplit = Math.min(hSplit, x1 + (x2 - x1) / 2); // Ensure hSplit is not farther than halfway across the canvas
+ //}
+
+ fill(pixels, x1, x2, y1, y2);
+
+ if (x2 - x1 >= canvasWidth / 4 && y2 - y1 >= canvasHeight / 4) {
+ divideCanvas(pixels, x1, hSplit, y1, vSplit);
+ divideCanvas(pixels, hSplit, x2, y1, vSplit);
+ divideCanvas(pixels, x1, hSplit, vSplit, y2);
+ divideCanvas(pixels, hSplit, x2, vSplit, y2);
+ } else if (x2 - x1 >= canvasWidth / 4) {
+ divideCanvas(pixels, x1, hSplit, y1, y2);
+ divideCanvas(pixels, hSplit, x2, y1, y2);
+ } else if (y2 - y1 >= canvasHeight / 4) {
+ divideCanvas(pixels, x1, x2, y1, vSplit);
+ divideCanvas(pixels, x1, x2, vSplit, y2);
+ }
+ } else {
+ fill(pixels, x1, x2, y1, y2);
+ }
+}
+
+
+ private void fill(Color[][] pixels, int x1, int x2, int y1, int y2) {
+ Color region = getRandomColor();
+ for (int i = y1; i < y2; i++) {
+ pixels[i][x1] = Color.BLACK;
+ pixels[i][x2 - 1] = Color.BLACK;
+ }
+
+ for (int j = x1; j < x2; j++) {
+ pixels[y1][j] = Color.BLACK;
+ pixels[y2 - 1][j] = Color.BLACK;
+ }
+
+ for (int i = y1 + 1; i < y2 - 1; i++) {
+ for (int j = x1 + 1; j < x2 - 1; j++) {
+ pixels[i][j] = region;
+ }
+ }
+ }
+
+
+ private Color getRandomColor() {
+ Color[] colors = {Color.RED, Color.YELLOW, Color.CYAN, Color.WHITE};
+ return colors[rand.nextInt(4)];
+ }
+}
+