/*
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 );
}