Mandala, Spirograph, Polygon, Circular
Log in to post a comment.
// You can find the Turtle API reference here: https://turtletoy.net/syntax
Canvas.setpenopacity(0.8);
// Global code will be evaluated once.
const turtle = new Turtle();
turtle.penup();
turtle.goto(-50,-20);
turtle.pendown();
function linspace(a,b,n) {
if(typeof n === "undefined") n = Math.max(Math.round(b-a)+1,1);
if(n<2) { return n===1?[a]:[]; }
var i,ret = Array(n);
n--;
for(i=n;i>=0;i--) { ret[i] = (i*b+(n-i)*a)/n; }
return ret;
}
function drawPolygon(n, x, y, r, rot) {
const phi = linspace(0+rot, 2*Math.PI+rot, n+1)
turtle.penup()
turtle.goto(r*Math.sin(phi[0])+x, r*Math.cos(phi[0])+y)
turtle.pendown()
for(i=n;i>=0;i--) {
turtle.goto(r*Math.sin(phi[i])+x, r*Math.cos(phi[i])+y)
}
turtle.penup()
}
const nMain = 8
const nSub = 12
const subAngleInc = 0.03
const subRotInc = 0.05
const subRadiusInc = -0.8
const mainRadius = 40
const polygonRadius = 50
const polygonN = 6
const rotOffset = -60.0/360*2*Math.PI
// The walk function will be called until it returns false.
function walk(i) {
const phi = linspace(0, 2*Math.PI, nMain+1)
const phiInc = linspace(0, subAngleInc*nSub, nSub)
const rotInc = linspace(0, subRotInc*nSub, nSub)
const radiusInc = linspace(0, subRadiusInc*nSub, nSub)
let x
let y
for(i=nMain;i>=0;i--) {
for(j=nSub;j>=0;j--) {
x = (mainRadius+radiusInc[j])*Math.cos(phi[i]+phiInc[j])
y = (mainRadius+radiusInc[j])*Math.sin(phi[i]+phiInc[j])
drawPolygon(polygonN, x, y, polygonRadius, phi[i]+rotInc[j]+rotOffset)
}
}
return false;
}