/* 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 Ported to p5.js by Casey Reas 11 July 2016 p5.js 0.5.2 Restored by Casey Reas <http://reas.com> 22 June 2016 Processing v.3.1.1 <http://processing.org> Implemented by Casey Reas Uses circle intersection code from William Ngan <http://metaphorical.net> Processing v.68 <http://processing.org> */ var numCircle = 100; var circles = []; function setup() { createCanvas(640, 480); frameRate(30); for (var i = 0; i < numCircle; i++) { var x = random(width); var y = random(height); var r = random(20, 60); var xspeed = random(-1.25, 1.25); var yspeed = random(-1.25, 1.25); circles[i] = new Circle(x, y, r, xspeed, yspeed, i); } } function draw() { background(255); for (var i = 0; i < circles.length; i++) { circles[i].update(); } for (var j = 0; j < circles.length; j++) { circles[j].move(); } } function Circle(px, py, pr, psp, pysp, pid) { this.x = px; this.y = py; this.r = pr; this.r2 = this.r * this.r; this.sp = psp; this.ysp = pysp; this.id = pid; this.update = function() { for (var i = this.id + 1; i < numCircle; i++) { intersect(circles[this.id], circles[i]); } stroke(102); noFill(); ellipse(this.x, this.y, this.r * 2, this.r * 2); } this.move = function() { this.x += this.sp; this.y += this.ysp; if (this.sp > 0) { if (this.x > width + this.r) { this.x = -this.r; } } else { if (this.x < -this.r) { this.x = width + this.r; } } if (this.ysp > 0) { if (this.y > height + this.r) { this.y = -this.r; } } else { if (this.y < -this.r) { this.y = height + this.r; } } } } function intersect(cA, cB) { var dx = cA.x - cB.x; var dy = cA.y - cB.y; var d2 = dx * dx + dy * dy; var d = sqrt(d2); if ((d > cA.r + cB.r) || (d < abs(cA.r - cB.r))) { return; // no solution } var a = (cA.r2 - cB.r2 + d2) / (2 * d); var h = sqrt(cA.r2 - a * a); var x2 = cA.x + a * (cB.x - cA.x) / d; var y2 = cA.y + a * (cB.y - cA.y) / d; var paX = x2 + h * (cB.y - cA.y) / d; var paY = y2 - h * (cB.x - cA.x) / d; var pbX = x2 - h * (cB.y - cA.y) / d; var pbY = y2 + h * (cB.x - cA.x) / d; stroke(0); line(paX, paY, pbX, pbY); }