/* Circle Intersection by William Ngan <contact@metaphorical.net>, modified by Casey Reas 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> */ var circleA, circleB; function setup() { createCanvas(300, 300); frameRate(30); circleA = new Circle(150, 150, 50); circleB = new Circle(150, 150, 60); noStroke(); } function draw() { background(226); 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); circleB.x = mouseX; circleB.y = mouseY; intersect(circleA, circleB); } function Circle (px, py, pr) { this.x = px; this.y = py; this.r = pr; this.r2 = this.r * 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; noStroke(); fill(0); rect( x2, y2, 5, 5 ); 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; ellipse( paX, paY, 10, 10 ); ellipse( pbX, pbY, 10, 10 ); }