A very simple method to construct a fractal inspired by this tweet: twitter.com/centrlpo…/1250172108811927552 by @CentrlPotential.
en.wikipedia.org/wiki/chaos_game
#fractal #chaosgame
Log in to post a comment.
// Chaos Game. Created by Reinder Nijhoff 2020
// @reindernijhoff
//
// https://turtletoy.net/turtle/f4ef806547
//
Canvas.setpenopacity(.1);
const turtle = new Turtle();
const numVertices = 5; // min=3, max=7, step=1
const lerpDist = 0.61803398875; // min=0.5, max=0.75, step=0.0000001
const mode = 0; // min=0, max=2, step=1
const neighbor = 1; // min=0, max=3, step=1
// create shape with numCorners vertices
const vertices = [];
for (let i=0; i<numVertices; i++) {
const a = (i+1/4) / numVertices * Math.PI * 2;
vertices.push([80*Math.cos(a), 80*Math.sin(a)]);
}
let randomIndex = 0, newRandomIndex = 0, prevRandomIndex;
function neighbors(i, j, n) {
return i == (j + n) % numVertices || (i + n) % numVertices == j;
}
function walk(i) {
// choose a random corner of the shape
do {
newRandomIndex = Math.random()*numVertices|0;
} while (
(mode == 1 && neighbors(randomIndex, newRandomIndex, neighbor)) ||
(mode == 2 && prevRandomIndex == randomIndex && neighbors(randomIndex, newRandomIndex, neighbor))
);
prevRandomIndex = randomIndex;
randomIndex = newRandomIndex;
// jump turtle somewhere halfway (at lerpDist) between current position of turtle
// and the randomly chosen vertex
const c = [turtle.x(), turtle.y()];
const n = vertices[newRandomIndex];
turtle.jump([lerpDist*n[0] + (1-lerpDist)*c[0], lerpDist*n[1] + (1-lerpDist)*c[1]]);
// draw small circle
turtle.circle(.1);
return i < 250000;
}