I was not able to calculate the extent of arcs 1 - 19 I can calculate the starting and ending intersection points but I can't work out how to convert that to an angle and extent.
Log in to post a comment.
// You can find the Turtle API reference here: https://turtletoy.net/syntax Canvas.setpenopacity(1); const radius = 4.5; // Scale minimum radius (gaps between concentric circles) const angle = 306.5; // Global code will be evaluated once. const turtle = new Turtle(); rippleSmall(0, 11 * - radius,10); // draw 10 concentric circles at (x,y n circles) X1 = 0; Y1 = 11 * - radius; X2 = 0; Y2= -radius; centeredCircle(0,Y2, radius * 20, 360) drawArc(19,342,323.3); // (radius,starting-angle,extent) // I have not found a way to calculate the extent drawArc(18,334,308.45); drawArc(17,328,296.6); drawArc(16,323,286.3); drawArc(15,318.3,277.253); drawArc(14,314.5,268.82); drawArc(13,310.5,261.0); drawArc(12,306.9,253.69); drawArc(11,303.2,246.49); drawArc(10,300,239.90); drawArc(9,296.8,233.5); drawArc(8,293.6,227.12); drawArc(7,290.3,220.70); drawArc(6,287.3,214.60); drawArc(5,284.9,209.68); drawArc(4,281.9,203.38); drawArc(3,278.2,196.38); drawArc(2,274.4,188.80); drawArc(1,272.9,185.70); console.log(angle); // f12 toggles browser console if(turtle.xcor() > intersectionArray[0]){ // an attempt to find the extent required to end the large arcs // centeredCircle(-90,-90, 5, 270) // try to turn on a flag to show when I have reached the intersection } function rippleSmall (x,y,count){ turtle.penup(); turtle.goto(x, y); for(var n=1; n <= count; n++){ turtle.pendown(); centeredCircle(x,y, radius * n, 360); turtle.penup(); turtle.goto(x, (y + (n* -1) * radius)); } } function drawArc(scale, heading, extent){ // find the intersection point of Large circle 19 with small circle 10 intersectionArray = intersectTwoCircles(X1, Y1,radius * 10 , X2, Y2 ,radius * scale) turtle.penup(); turtle.goto(intersectionArray[2], intersectionArray[3]) // radius 19 turtle.pendown(); turtle.setheading(heading); //342 set the angle of the 19th larger circle that intersects turtle.circle(radius * scale, -1 * extent); // draw the 19th large circle } // 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(); } // 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; // 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]; }