Fouriertletoy

A start for drawing 'vector' images using Fourier series of functions of i
From 3Blue1Browns on Fourier series youtube.com/watch?v=r6sgwtcmz2k

Log in to post a comment.

function FourierSeries(series) {
    comp = series.pop();
    return new FourierComponent(comp[0], comp[1], comp[2], series.length > 0? FourierSeries(series): null);
}

function FourierComponent(radius, phase, rotation, child = null) {
    this.r = radius;
    this.p = phase / (2 * Math.PI);
    this.o = rotation;
    
    this.c = child;
}
FourierComponent.prototype.transpose = function(i) {
    return (
        this.o + (
            (i / 3600) * (2 * Math.PI)
        )
    ) / this.p;
}
FourierComponent.prototype.getX = function(i) {
    return (this.r * Math.cos( this.transpose(i) ) ) + (this.c === null? 0: this.c.getX(i));
}
FourierComponent.prototype.getY = function(i) {
    return (this.r * Math.sin( this.transpose(i) ) ) + (this.c === null? 0: this.c.getY(i));
}
FourierComponent.prototype.setChild = function(child) {
    this.c = child;
    return this;
}

function wait(ms) {
  var start = new Date().getTime();
  do { var end = new Date().getTime(); } while(end < start + ms);
}

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

// Global code will be evaluated once.
const turtle = new Turtle();
turtle.penup();

var fc = FourierSeries([
      [70, Math.PI / 2, 0]
    , [20, Math.PI * 50, 0]
    , [5, Math.PI / 20, 0]
    , [1, Math.PI / 300, 0]
]);

/*var fc = new FourierComponent(70, 2 * Math.PI, 0,
            new FourierComponent(20, Math.PI / 25, 0,
                new FourierComponent(5, Math.PI*2, 0,
                    new FourierComponent(1, Math.PI*300, 0)
                )
            )
        );
*/

// The walk function will be called until it returns false.
function walk(i) {
    turtle.goto(fc.getX(i), fc.getY(i));

    if(i == 0) {
        turtle.pendown();
    }
    //wait(.1);
    return i < 360000 / 4;
}