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=3; // min=2, max=20, step=1
const numlayers=7 // min=2, max=10, step=1
const growth=1; // 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,2),randomNumber(1,7));
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;
}