A basic spirograph, i.e., one circle rolling on another.
Log in to post a comment.
// Forked from "Spirograph" by troisiemetype
// https://turtletoy.net/turtle/783125b928
// You can find the Turtle API reference here: https://turtletoy.net/syntax
Canvas.setpenopacity(1);
let r1 = 20; // min = 1, max = 100, step = 1
let r2 = 65; // min = 1, max = 100, step = 1
// rPen is the position on the second circle, it's a percentage of the radius. value > 100 are outside of the circle
let rPen = 140; // min = 1, max = 600, step = 1
//const turns = 1; // min = 1, max = 50, step = 1
rPen /= 100;
let stopat = 365; // min = 0, max = 365, step = 1
// Global code will be evaluated once.
const turtle = new Turtle();
function getTurns(x, y){
let tmp = 0;
if(y > x){
tmp = x;
x = y;
y = tmp;
}
let yy = y;
let r = y;
let rr = r;
while(r != 0){
rr = r;
r = x % yy;
// console.log(x, yy, r, rr);
x = yy;
yy = r;
}
return y / rr;
}
let turns = getTurns(r1, r2);
if(r1 > r2){
turns *= r2 * ((r2 + r1) / r1);
}
r1 /= 3;
r2 /= 3;
//console.log(turns);
// The walk function will be called until it returns false.
function walk(i) {
let theta = Math.PI * i / 180;
let cx = Math.cos(theta) * (r1 + r2);
let cy = Math.sin(theta) * (r1 + r2);
let rx = rPen * Math.cos(theta * (r2 + r1) / r1) * r2;
let ry = rPen * Math.sin(theta * (r2 + r1) / r1) * r2;
if(i) turtle.goto(cx + rx, cy + ry);
else turtle.jump(cx + rx, cy + ry);
return i <= stopat * turns;
}