int n = 500; // number of rockets int m = 30; // number of barriers Rocket[] r = new Rocket[n]; // rockets Barrier[] b = new Barrier[m]; void setup () { size(500, 350); updateIt(); framerate(60); // background(255); stroke(0, 0, 0, 10); smooth(); } void draw() { for(int i = 0; i < n; i++) { r[i].update(); r[i].show(); } } void mousePressed() { updateIt(); } void updateIt() { for(int i =0; i < n; i++) { r[i] = new Rocket(); } background(255); for(int i = 0; i < m; i++) { b[i] = new Barrier(); // noStroke(); // fill(200, 0, 0); // rect(b[i].x - 1, b[i].y - 1, 3, 3); } stroke(random(200), random(200), random(200), 10); // stroke(0, 0, 0, 10); } class Rocket { float x, y, angle; Rocket() { x = random(-50, 0); y = random(-50, 0); angle = random(360); } void update() { float minD = 10000, d, dx, dy, a; int minDid = -1; x += cos(radians(angle)); y += sin(radians(angle)); if(angle > 360) angle = 0; if(angle < 0) angle = 360; if(x > width + 50) x = -50; if(x < -50) x = width + 50; if(y > height + 50) y = -50; if(y < -50) y = height + 50; // find the closer one for(int i = 0; i < m; i++) { dx = this.x - b[i].x; dy = (this.y - b[i].y); a = degrees(atan2(dy, dx)) + 180; // float kokot = a + 180; // println(angle + " " + kokot); if(abs(angle - a) < 30 || abs(angle - a) > 330) { d = sqrt(dx*dx + dy*dy); if(minD > d) { minD = d; minDid = i; } } } if(minDid == - 1) return; if(minD < 80) { a = degrees(atan2((this.y - b[minDid].y), this.x - b[minDid].x)) + 180; if(angle - a > 0) { if(abs(angle - a) < 30) { angle++; } else { angle--; } } if(angle - a <= 0) { if(abs(angle - a) < 30) { angle--; } else { angle++; } } return; } if((int)random(50) == 0) { if((int)random(1) == 0) { angle++; } else { angle--; } } //angle += 0.0001; } void show() { point(x, y); } } class Barrier { float x, y; Barrier() { x = random(width); y = random(height); } }