Spiral

An animated spiral

Log in to post a comment.

// You can find the Turtle API reference here: https://turtletoy.net/syntax
Canvas.setpenopacity(1);

const GOLDEN_RATIO = 1.61803;
const STEPS = 200;
const INVERT_POINT = STEPS / 2;
const STEP_SIZE = 2;

const SLEEP_TIME = 10;

// Global code will be evaluated once.
const turtle = new Turtle();
turtle.penup();
turtle.goto(0, 0);
turtle.pendown();
turtle.left(90);

let _length = STEP_SIZE;
let _direction = 1;
let _timesInverted = 0;

const turn = (direction = _direction) => turtle.right(direction * 90);

function step(length) {
    turtle.forward(length);
}

function invert() {
    console.log('invert');
    _timesInverted++;
    
    let stepSize = STEP_SIZE / (2 * _timesInverted);
    turn(-_direction);
    turn(1);
    
    step(stepSize);
    turn(1);
    sleep();
    
    step(stepSize);
    turn(_direction);
    
    _direction *= -1;
    _length += STEP_SIZE * _direction * 2;
    turn();
}

function drawArm() {
    step(_length);
    turn();
}

function drawCorner() {
    if (_currentIndex > 0 && _currentIndex % INVERT_POINT === 0) {
        invert();
        sleep();
        return;
    }
    
    drawArm();
    sleep();
    drawArm();
    
    _length += STEP_SIZE * _direction;
}

function sleep(ms = SLEEP_TIME) {
  var date = new Date();
  var curDate = null;

  do { curDate = new Date(); }
  while (curDate-date < ms);
}

function walk(i) {
    _currentIndex = i < STEPS - 1 ? i : 0;
    drawCorner();
    sleep();
    // return i < STEPS - 1
    return i < STEPS * 2 - 1;
}