Circles On Circles

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;

}