/** a boids demo by Guru */ Boid[] b; void setup() { size( 600, 600 ); smooth(); frameRate( 25 ); b = new Boid[50]; for ( int i=0; i < b.length; i ++ ) { b[i] = new Boid( random( width) , random(height), random( -10, 10 ), random( -10, 10 ), b ); } background(0); } int count = 0; int next = int(random( 100 )); void draw() { count ++; if ( count % next == 0 ) { for ( int i=0; i < b.length; i ++ ) { b[i].boo(); } next = int(100 + random(1000)); } noStroke(); fill( 0, 20 ); rect(0,0,width,height); for ( int i=0; i < b.length; i ++ ) { b[i].update(); b[i].draw(); } } public class Boid { float r1 = 40; float r2 = 80; float r3 = 160; float x,y; float vx, vy; Boid[] others; public Boid( float x, float y, float vx, float vy, Boid[] others ) { this.x = x; this.y = y; this.vx = vx; this.vy = vy; this.others = others; } void boo() { vx = random( -25, 25 ); vy = random( -25, 25 ); } public void update() { sep(); align(); coh(); float l = sqrt( sq( vx ) + sq ( vy )); if (l > 4 ) { vx = 0.9 * vx; vy = 0.9 * vy; } x += vx; y += vy; if (x > width - 30 ) { vx -= 2; } if (x < 30 ) { vx += 2; } if (y > height -30 ) {vy -= 2; } if (y < 30) { vy += 2; } } public void sep() { int count = 0; float sx = 0; float sy = 0; for ( int i = 0; i < others.length; i ++ ) { float d = sqrt( sq( x - others[i].x ) + sq( y - others[i].y )); if (d < r1 && this != others[i] ) { count++; sx += others[i].x; sy += others[i].y; } } if ( count > 0 ){ sx = x - sx / count; sy = y - sy / count; float l = sqrt( sq( sx ) + sq ( sy )); sx = 1.2 * sx / l; sy = 1.2 * sy / l; } vx += sx; vy += sy; } public void align() { int count = 0; float dx = 0; float dy = 0; for ( int i = 0; i < others.length; i ++ ) { float d = sqrt( sq( x - others[i].x ) + sq( y - others[i].y )); if (d < r2 && this != others[i] ) { count++; dx += others[i].vx; dy += others[i].vy; } } if ( count > 0 ){ dx = dx / count; dy = dy / count; float l = sqrt( sq( dx ) + sq ( dy )); dx = dx / l; dy = dy / l; } vx += dx; vy += dy; } public void coh() { int count = 0; float sx = 0; float sy = 0; for ( int i = 0; i < others.length; i ++ ) { float d = sqrt( sq( x - others[i].x ) + sq( y - others[i].y )); if (d < r3 && d > r1 && this != others[i] ) { count++; sx += others[i].x; sy += others[i].y; } } if ( count > 0 ){ sx = x - sx / count; sy = y - sy / count; float l = sqrt( sq( sx ) + sq ( sy )); sx = sx / l; sy = sy / l; } vx -= sx; vy -= sy; } public void draw() { fill(255); stroke( 127 ); pushMatrix(); translate( x, y ); rotate( atan( vy/vx ) + ( vx < 0 ? PI : 0 )); beginShape(); vertex( -15, -5 ); vertex( -15, 5 ); vertex( 15, 5 ); vertex( 15, -5 ); endShape(CLOSE); popMatrix(); } }