Generates art based on the golden ratio.
Log in to post a comment.
Canvas.setpenopacity(-1);
const turtle = new Turtle();
turtle.pendown();
const maxElems = 3+Math.floor(Math.random()*4);
const PHI = 0.618099;
const PHI1 = 1.618099;
const w = 200;
const h = 200;
const chance = 0.125;
const rand = (from) => {
if (Math.random() < chance) {
return from/2;
}
if (Math.random() < chance) {
return from-from*PHI;
}
if (Math.random() < chance) {
return from-from*PHI*PHI;
}
if (Math.random() < chance) {
return from/PHI1;
}
if (Math.random() < chance) {
return from*PHI*PHI;
}
if (Math.random() < chance) {
return from*PHI;
}
if (Math.random() < chance) {
return from*PHI1;
}
return from;
}
const randEdge = (edge, offset) => {
if (Math.random() < 0.5) {
return edge-offset;
}
if (Math.random() < 0.5) {
return 0+offset;
}
return rand(edge)-offset;
}
const elems = (() => {
let elems = [];
while (elems.length < maxElems) {
const ew = rand(w);
const eh = rand(h);
const xedge = randEdge(w, ew);
const yedge = randEdge(h, eh);
elems.push({
type: Math.random() < 0.8 ? 'rect' : 'circle',
x: xedge,
y: yedge,
w: ew,
h: eh,
fill: 0.5+Math.round(Math.random()*4)/4,
fillAngle: 22.5+22.5*Math.floor(Math.random()*7)
})
}
return elems;
})();
function walk(i) {
for (const { type, x, y, w, h, fill, fillAngle } of elems) {
if (type === "circle") {
turtle.seth(0);
for (let i = w-h; i > 0; i-=fill) {
turtle.jump((-100+(x === 0 ? x+w-i : x-i)), (-100+y-i));
turtle.circle(i);
}
} else {
turtle.seth(fillAngle);
for (let i = 0; i < h; i+=fill) {
turtle.jump(-100+x, -100+y+i);
turtle.forward(w/Math.cos(Math.PI*fillAngle/180));
}
const step = (fill)/Math.sin(Math.PI*fillAngle/180);
for (let i = step; i < w; i+=step) {
turtle.jump(-100+x+i, -100+y);
turtle.forward((w-i)/Math.cos(Math.PI*fillAngle/180));
}
}
}
return false;
}