class Point { float mx, my; Point(float imx, float imy) { mx = imx; my = imy; } float squaredDistanceTo(Point p) { return pow(p.mx - this.mx,2.0) + pow(p.my - this.my,2.0); } } Vector centers; float radius = 4.0; void caret(Point p, float len) { float angle1 = random(0,TWO_PI); float angle2 = angle1 + random(radians(40),radians(80)); line(p.mx, p.my, p.mx+len*cos(angle1), p.my+len*sin(angle1)); line(p.mx, p.my, p.mx+len*cos(angle2), p.my+len*sin(angle2)); } void setup() { size(320,240); smooth(); } void draw() { centers = new Vector(); int retries; do { boolean acceptable; Point p; retries = 0; do { p = new Point(random(0.0,width),random(0.0,height)); acceptable = true; for (Iterator iter = centers.iterator(); iter.hasNext();) { if (p.squaredDistanceTo((Point)iter.next()) < radius*radius*4.2) { retries++; acceptable = false; break; } } } while (!acceptable && retries < 1000); if (acceptable) { centers.add(p); retries = 0; } } while (retries == 0); background(255); for (Iterator iter = centers.iterator(); iter.hasNext();) { caret((Point)iter.next(),radius); } }