This time without rotation bug.
Log in to post a comment.
// Forked from "Spiro 1" by kabacis
// https://turtletoy.net/turtle/2a892789a4
// You can find the Turtle API reference here: https://turtletoy.net/syntax
Canvas.setpenopacity(1);
let stepMul=256;// min=2 max=512 step=1
let offset=-0.7; // min=-1 max=1 step=0.1
let length=57; // min=1 max=200 step=1
let extraRot=-100; // min=-360 max=360 step=5
let a2 = 68; // min=0 max=90 step=1
let scaleX=0.4; // min=0.3 max=1.3 step=0.1
let zfreq=1; // min=0.1 max=10 step=0.01
let z_phase_offset=-0.5; // min=-1 max=1 step=0.05
let h=191; // min=0.0 max=200 step=0.1
let rs=5.65; // min=0.1 max=10 step=0.01
let rVarF = 2.77; // min=0.01 max=10 step=0.01
let rVar = 0.337; // min=0.0 max=4 step=0.001
let lift=0; // min=0, max=1, step=1 (No, Yes)
let verticalOffset = -20; // min=-50, max=50, step=1
let stemL = 81; // min=0, max=100, step=1
let stemB = 3; // min = 0, max=100, step=1
// Global code will be evaluated once.
const turtle = new Turtle();
turtle.penup();
function f(i, down) {
let x = Math.cos(2 * Math.PI * i / stepMul) + offset;
let y = Math.sin(2 * Math.PI * i / stepMul);
let rotk = Math.PI * 2 * (Math.floor((i + (down ? 0 : -1)) / stepMul) * rs);
let xt=x;
let yt=y;
x = Math.cos(rotk)*xt-Math.sin(rotk)*yt;
y = Math.sin(rotk)*xt+Math.cos(rotk)*yt;
let rvarA = Math.PI * 2 * (Math.floor((i + (down ? 0 : -1)) / stepMul) * rVarF);
let r2 = 1 + Math.sin(rvarA) * rVar;
x *= r2;
y *= r2;
let realRot = 2 * Math.PI * extraRot/360;
xt=x;
yt=y;
x = Math.cos(realRot)*xt-Math.sin(realRot)*yt;
y = Math.sin(realRot)*xt+Math.cos(realRot)*yt;
let t = (1+Math.cos(zfreq * 2 * Math.PI * i / stepMul))*0.5;
let w = 1;//t;
let z = (1-Math.cos(Math.PI*(t*0.5 + z_phase_offset)))*0.5;
x *= scaleX * w;
y *= scaleX * w;
z *= h * scaleX;
x *= 50;
y = 50 * y * Math.cos(Math.PI * a2 / 180) - z * Math.sin(Math.PI * a2 / 180);
y += verticalOffset;
turtle.goto(x, y);
}
turtle.goto(0, verticalOffset);
turtle.pendown();
for (var j=0;j<stepMul; j++) {
turtle.goto(stemB*Math.sin(j/stepMul*Math.PI), verticalOffset+stemL*j/stepMul);
}
turtle.goto(0, verticalOffset+stemL);
turtle.penup();
// The walk function will be called until it returns false.
function walk(i) {
let i2 = i-1;
let first = ((i2 % stepMul) == 0);
let last = (((i2+1) % stepMul) == 0);
f(i2, true);
if (first) { turtle.pendown(); }
if (last) {
f(i2+1, false);
if (lift) {
turtle.penup();
}
}
return i < length * stepMul;
}