Visualized in the style popularized by Numberphile.
Log in to post a comment.
const ITERATIONS = 61; // min=1, max=200, step=1
const MARGIN = 5; // min=0, max=50, step=5
const RAD_STEP = 0.1; // min=0.05, max=1.6, step=0.05
Canvas.setpenopacity(1);
const turtle = new Turtle();
turtle.jump(-100 + MARGIN, 0);
const seq = [0]
for (var i = 1; i <= ITERATIONS ; i++) {
let curr = seq[i - 1] - i;
for (var j = 0; j < i ; j++) {
if (seq[j] === curr || curr < 0) {
curr = seq[i - 1] + i;
break;
}
}
seq[i] = curr;
}
function drawHalfCircle(r, cx, cy, isAbove) {
let endA = Math.PI * 2;
if((isAbove && r > 0) || (!isAbove && r < 0))
endA = 0;
const step = Math.PI < endA ? RAD_STEP : -RAD_STEP;
for(let a = Math.PI ; step < 0 ? a > endA : a < endA ; a += step) {
x = cx + r * Math.cos(a);
y = cy + r * Math.sin(a);
turtle.goto(x, y);
}
}
const INTERVAL = (200 - (2 * MARGIN)) / Math.max(...seq);
function walk(i) {
const r = ((seq[i+1] - seq[i]) * INTERVAL) / 2;
const [pX, pY] = turtle.pos();
drawHalfCircle(r, pX + r, pY, i % 2 === 0);
return i < (ITERATIONS - 1);
}