// Sketch for generating sticky atoms // (c) 2006 duane a. bailey final static int SIZE = 300; int points; int closePoints; BFont ArialBold; int side, dist, oldx, oldy; float angle, dx, dy, x, y; void begin() { side = int(random(4)); dist = int(random(SIZE)); angle = random(2*3.1415926); dx = cos(angle); dy = sin(angle); x = 0; y = 0; switch (side) { case 0: x = 0; y = dist; break; case 1: x = dist; y = 0; break; case 2: x = SIZE-1; y = dist; break; case 3: x = dist; y = SIZE-1; break; } } color b,r,w; int xq[],yq[]; int QLEN=100; int nq,qh,qt; void setup() { b = color (0,0,0); r = color (255,0,0); w = color(255,255,255); size(SIZE,SIZE); xq = new int[QLEN]; yq = new int[QLEN]; nq = 0; qh = 0; qt = 0; background(255); //fill(r); noStroke(); //ellipseMode(CORNER); //ellipse(SIZE/2-10,SIZE/2-10,20,20); //set(SIZE/2,SIZE/2,r); set(SIZE/2,SIZE/2,r); begin(); } void add(int x, int y) { if (nq < QLEN) { nq++; } else { set(xq[qh],yq[qh],w); qh = (qh+1)%QLEN; } set(x,y,b); xq[qt] = x; yq[qt] = y; qt = (qt+1)%QLEN; } boolean near(int ix, int iy) { if (ix > 0) { if (iy > 0 && r == get(ix-1,iy-1)) return true; if (r == get(ix-1,iy)) return true; if (iy < SIZE-1 && r == get(ix-1,iy+1)) return true; } if (iy > 0 && r == get(ix,iy-1)) return true; if (iy < SIZE-1 && r == get(ix,iy+1)) return true; if (ix < SIZE-1) { if (iy > 0 && r == get(ix+1,iy-1)) return true; if (r == get(ix+1,iy)) return true; if (iy < SIZE-1 && r == get(ix+1,iy+1)) return true; } return false; } void loop() { for (int i = 0; i < 200; i++) { if (x >= 0 && x < SIZE && y >= 0 && y < SIZE) { x = x + dx; y = y + dy; int ix = int(x); int iy = int(y); if (near(ix,iy)) { set(ix,iy,r); begin(); } else { add(ix,iy); } } else begin(); } }