Fibonacci

Aurea Spirale

Espiral

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();
turtle.penup();
turtle.goto(40,0);
turtle.pendown();

const sideLen = 3.2
const sideSizes = []

function main() {
    let valueOne = 0
    let valueTwo = 1
    let fib = 1;
    Array.from(Array(9).keys()).forEach(() => {
        turtle.right(90*-3)
        drawSquare({ sideSize: fib * sideLen })
        sideSizes.push(fib * sideLen)
        fib = valueOne + valueTwo  
        valueOne = valueTwo
        valueTwo = fib
    })
}

function drawSquare({ sideSize }) {
    Array.from(Array(10).keys())
    .forEach(() => {
            turtle.forward(sideSize)        
            turtle.left(90*-1)       
    })
}

function spiral() {
    const angle = 90
    turtle.left(90)    // turn turtle to down position
    turtle.penup()
    // move turtle to starting point of first square
    turtle.setpos(40, 0)
    turtle.pendown()
    // draw fibonacci spiral
    sideSizes.forEach( arcValue => arc(arcValue, angle))
}

function arc(r, angle) {
    const arc_length = 2 * Math.PI * r * Math.abs(angle) / 360
    const n = Math.trunc(arc_length / 4) + 1
    const step_length = arc_length / n
    const step_angle = Math.fround(angle) / n
    // Before starting making a slight left turn.
    turtle.left(step_angle/2)
    arcLine(n, step_length, step_angle)
    turtle.right(step_angle/2)
}

function arcLine(n, length, angle) {
   Array.from(Array(n).keys())
    .forEach(() => {
        turtle.forward(length)
        turtle.left(angle)   
    })
}

main();
spiral();