Locate the intersection(s) of 2 circles
Uses a function by Reinder which draws a circle centered on a specific (x,y) location
Log in to post a comment.
// Locate the intersection(s) of 2 circles // thanks to jupdike/IntersectTwoCircles.js // https://gist.github.com/jupdike/bfe5eb23d1c395d8a0a1a4ddd94882ac // You can find the Turtle API reference here: https://turtletoy.net/syntax Canvas.setpenopacity(1); const radius = 40; // min=5 max=100 step=1 const X1 = -14; // min=-100 max=100 step=1 const Y1 = -12; // min=-100 max=100 step=1 const X2 = 28; // min=-100 max=100 step=1 const Y2 = 23; // min=-100 max=100 step=1 // Global code will be evaluated once. const turtle = new Turtle(); centeredCircle(X1, Y1, radius, 360); centeredCircle(X2, Y2, radius, 360); intersectTwoCircles(X1, Y1,radius, X2, Y2 ,radius) // thanks to jupdike/IntersectTwoCircles.js // https://gist.github.com/jupdike/bfe5eb23d1c395d8a0a1a4ddd94882ac // based on the math here: // http://math.stackexchange.com/a/1367732 // x1,y1 is the center of the first circle, with radius r1 // x2,y2 is the center of the second ricle, with radius r2 function intersectTwoCircles(x1,y1,r1, x2,y2,r2) { var centerdx = x1 - x2; var centerdy = y1 - y2; var R = Math.sqrt(centerdx * centerdx + centerdy * centerdy); if (!(Math.abs(r1 - r2) <= R && R <= r1 + r2)) { // no intersection return []; // empty list of results } // intersection(s) should exist var R2 = R*R; var R4 = R2*R2; var a = (r1*r1 - r2*r2) / (2 * R2); var r2r2 = (r1*r1 - r2*r2); var c = Math.sqrt(2 * (r1*r1 + r2*r2) / R2 - (r2r2 * r2r2) / R4 - 1); var fx = (x1+x2) / 2 + a * (x2 - x1); var gx = c * (y2 - y1) / 2; var ix1 = fx + gx; var ix2 = fx - gx; var fy = (y1+y2) / 2 + a * (y2 - y1); var gy = c * (x1 - x2) / 2; var iy1 = fy + gy; var iy2 = fy - gy; centeredCircle(ix1, iy1, 2, 360); // highlight intersection point 1 centeredCircle(ix2, iy2, 2, 360); // highlight intersection point 1 // note if gy == 0 and gx == 0 then the circles are tangent and there is only one solution // but that one solution will just be duplicated as the code is currently written return [ix1, iy1, ix2, iy2]; } // thanks to Reinder for this function // Draws a circle centered a specific x,y location // and returns the turtle to the original angle after it completes the circle. function centeredCircle(x,y, radius, ext) { turtle.penup(); turtle.goto(x,y); turtle.backward(radius); turtle.left(90); turtle.pendown(); turtle.circle(radius, ext); turtle.right(90); turtle.penup(); turtle.forward(radius); turtle.pendown(); }