/* Structure 3 (work in progress) A surface filled with one hundred medium to small sized circles. Each circle has a different size and direction, but moves at the same slow rate. Display: A. The instantaneous intersections of the circles B. The aggregate intersections of the circles Implemented by Casey Reas <http://groupc.net> Uses circle intersection code from William Ngan <http://metaphorical.net> Processing v.68 <http://processing.org> */ Circle circleA, circleB; void setup() { size( 300, 300 ); framerate( 30 ); circleA = new Circle( 150, 150, 90 ); circleB = new Circle( 150, 150, 120 ); ellipseMode(CENTER_DIAMETER); rectMode(CENTER_DIAMETER); noStroke(); //smooth(); } void loop() { background(226); //circleB.x = mouseX; //circleB.y = mouseY; circleA.update(); circleB.update(); fill( 153, 150 ); ellipse( circleA.x, circleA.y, circleA.r*2, circleA.r*2 ); ellipse( circleB.x, circleB.y, circleB.r*2, circleB.r*2 ); intersect( circleA, circleB ); } class Circle { float x, y, r, r2; float xspeed, yspeed; Circle( float px, float py, float pr ) { x = px; y = py; r = pr; r2 = r*r; xspeed = random(-2.0, 2.0); yspeed = random(-2.0, 2.0); } void update() { x += xspeed; //y += yspeed + random(-0.1, 0.1); if(x > width + r) { x = -r; } if(x < -r) { x = width+r; } if(y > height + r) { y = -r; } if(y < -r) { y = height+r; } } } void intersect( Circle cA, Circle cB ) { float dx = cA.x - cB.x; float dy = cA.y - cB.y; float d2 = dx*dx + dy*dy; float d = sqrt( d2 ); if ( d>cA.r+cB.r || d<abs(cA.r-cB.r) ) return; // no solution float a = (cA.r2 - cB.r2 + d2) / (2*d); float h = sqrt( cA.r2 - a*a ); float x2 = cA.x + a*(cB.x - cA.x)/d; float y2 = cA.y + a*(cB.y - cA.y)/d; noStroke(); fill(0); rect( x2, y2, 5, 5 ); float paX = x2 + h*(cB.y - cA.y)/d; float paY = y2 - h*(cB.x - cA.x)/d; float pbX = x2 - h*(cB.y - cA.y)/d; float pbY = y2 + h*(cB.x - cA.x)/d; ellipse( paX, paY, 10, 10 ); ellipse( pbX, pbY, 10, 10 ); }