The wanderers IX

Let's play with Bezier curves !

Log in to post a comment.

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

const size = 95;            // min = 5, max = 100, step = 5
const space = 20;            // min = 0, max = 20, step = 1
const amplitude = 1;      // min = 0.1, max = 3, step = 0.1

let turtle = new Turtle();

class cubicBezier{
    constructor(a, b, c, d){
        this.a = a;
        this.b = b;
        this.c = c;
        this.d = d;
        
        this.turtle = new Turtle();
        
        this.turtle.jump(this.a);
    }
    
    walk(t){
        let l1 = lerp(this.a, this.b, t);
        let l2 = lerp(this.b, this.c, t);
        let l3 = lerp(this.c, this.d, t);
        
        l1 = lerp(l1, l2, t);
        l2 = lerp(l2, l3, t);
        
        this.turtle.goto(lerp(l1, l2, t));
    }
}

function lerp(a, b, t){
    let x = a[0] + (b[0] - a[0]) * t;
    let y = a[1] + (b[1] - a[1]) * t;
    
    return [x, y];
}

function rand(){
    return Math.random() * 2 * size - size;
}

function randomPoint(){
    return [amplitude * rand(), amplitude * rand()];
}


let curves = [];

let b1 = randomPoint();
let b2 = randomPoint();
let c1 = randomPoint();
let c2 = randomPoint();

for(let i = 0; i <= 1; i += 0.05){
    let y = i * 2 * space - space;
    let curve = new cubicBezier([-size, y], lerp(b1, b2, i), lerp(c1, c2, i), [size, y]);
    curves.push(curve);
}

// The walk function will be called until it returns false.
function walk(i) {
    
    for(let j = 0; j <= 1.001; j += 0.01){
        curves[i].walk(j);
    }
    
    if(i >= curves.length - 1) return false;

    return true;
}