Circles On Circles
Log in to post a comment.
// You can find the Turtle API reference here: https://turtletoy.net/syntax Canvas.setpenopacity(1); // Global code will be evaluated once. const turtle = new Turtle(); const startingradius=7; // min=2, max=20, step=1 const numlayers=6 // min=2, max=10, step=1 const growth=2; // min=0, max=5, step=1 function randomNumber(min, max) { return Math.floor(Math.random() * (max - min + 1) + min); } function centered_circle(radius) { startx = turtle.x(); starty = turtle.y(); turtle.setheading(0); turtle.penup(); turtle.forward(radius); turtle.setheading(90); turtle.pendown(); turtle.circle(radius); turtle.jump(startx,starty); } function fuzzy_circle(radius,fuzziness,layers) { var originalHeading = turtle.heading(); var originalX = turtle.xcor(); var originalY = turtle.ycor(); for (let i=0; i < layers; i++) { turtle.setheading(randomNumber(0,360)); turtle.penup(); turtle.forward(randomNumber(1,fuzziness*radius*.000000000001)); turtle.pendown(); centered_circle(radius); turtle.jump(originalX,originalY); } turtle.setheading(originalHeading); } function concentricCircle(radius,gap) { for (let i=0; i < radius/gap; i++) { centered_circle((i)*gap); } } function decorate_outer (radius,num_decorators) { var startx = turtle.xcor(); var starty = turtle.ycor(); var decorator_radius = (Math.PI * radius)/(num_decorators - Math.PI); for (let i=0; i < num_decorators; i++) { turtle.setheading(i*360/num_decorators); turtle.penup(); turtle.forward(radius+decorator_radius); turtle.pendown(); random_circle(decorator_radius); turtle.jump(startx,starty); } } function decorate_inner (radius,num_decorators,filled) { var startx = turtle.xcor(); var starty = turtle.ycor(); var decorator_radius = (Math.PI * radius)/(num_decorators + Math.PI); if (filled=true) { random_circle(radius-(2*decorator_radius)); } for (let i=0; i < num_decorators; i++) { turtle.setheading(i*360/num_decorators); turtle.penup(); turtle.forward(radius-decorator_radius); turtle.pendown(); random_circle(decorator_radius); turtle.jump(startx,starty); } } function spoked_circle (radius,spokes) { var startx = turtle.xcor(); var starty = turtle.ycor(); for (let i=0; i < spokes; i++) { turtle.setheading(i*360/spokes); turtle.pendown(); turtle.forward(radius); turtle.penup(); turtle.jump(startx,starty); } } function random_circle (radius) { if (radius<3) { centered_circle(radius); } else { const circlePick = Math.floor(Math.random() * 6); switch(circlePick) { case 1: spoked_circle(radius,randomNumber(3,30)); break; case 2: fuzzy_circle(radius,randomNumber(1,3),randomNumber(1,3)); break; case 3: concentricCircle(radius,randomNumber(1,3)); break; case 4: decorate_inner(radius,randomNumber(6,15),true); break; case 5: decorate_inner(radius,randomNumber(6,15),false); break; } } } function walk(i) { var current_radius=startingradius; var layer = 0; var decorators = 11; random_circle(current_radius); for (let layer=0; layer<numlayers; layer++) { current_radius = current_radius + 1; console.log("Radius:" + current_radius + "; Decorators:" + decorators); decorate_outer(current_radius,decorators); decorators = decorators + growth; current_radius = current_radius + Math.floor(2*(Math.PI * current_radius)/(decorators - Math.PI)); } return i < 1; }