From 81ba9eb66f8284d8760012973f84cdbe617ceb94 Mon Sep 17 00:00:00 2001 From: pants Date: Mon, 21 Sep 2026 14:16:34 -0700 Subject: init --- c2/mondrian/Mondrian.java | 97 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 c2/mondrian/Mondrian.java (limited to 'c2/mondrian/Mondrian.java') 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)]; + } +} + -- cgit v1.2.3