// Truchet Tiles - Jim Bumgardner int gridW = 24; int gridH = 24; int cellW, cellH; int nbrCells = gridW * gridH; Cell[] cells = new Cell[nbrCells]; PGraphics tile1, tile2; PGraphics makeTile(boolean state) { PGraphics g = createGraphics(cellW, cellH, JAVA2D); g.beginDraw(); g.colorMode(RGB, 256); g.smooth(); g.background(255); g.stroke(0); g.strokeWeight(4); g.noFill(); if (state) { g.ellipse(0, 0, cellW, cellH); g.ellipse(cellW, cellH, cellW, cellH); } else { g.ellipse(0, cellH, cellW, cellH); g.ellipse(cellW, 0, cellW, cellH); } g.endDraw(); return g; } void setup() { size(500,500); smooth(); // I use ceil to round up, which insures the tiles go all the way across the screen, // without the gap caused by rounding down. cellW = ceil(width/(float) gridW); cellH = ceil(height/(float) gridH); tile1 = makeTile(false); tile2 = makeTile(true); for (int i = 0; i < nbrCells; ++i) { int px = cellW * (int) (i % gridW); int py = cellH * (int) (i / gridW); cells[i] = new Cell(px, py, i); } noCursor(); noLoop(); } void draw() { background(255); for (int i = 0; i < nbrCells; ++i) { cells[i].render(); } } int lastN = -1; void mouseMoved() { int gx = (int) (mouseX / cellW); int gy = (int) (mouseY / cellH); int n = constrain(gy*gridW+gx,0,nbrCells-1); if (n != lastN) { cells[n].state = !cells[n].state; lastN = n; redraw(); } } class Cell { int px,py; int idx; boolean state; Cell(int _px, int _py, int _idx) { px = _px; py = _py; idx = _idx; state = random(1) < .5? false : true; } void render() { image(state? tile1 : tile2, px, py, cellW, cellH); } }