xxxxxxxxxx
96
let offset
let angle
let startingAngle
let sequences;
function collatz(k) {
sequence = [];
while (k != 1) {
if (k in sequences) {
for (let i = 0; i < sequence.length; i++) {
sequences[sequence[i]] = [sequence.slice(i), sequences[k]];
}
return [sequence, sequences[k]];
}
sequence.push(k)
if (k % 2 == 0) {
k /= 2;
} else {
k = (k * 3 + 1) / 2;
}
}
sequence.push(k);
for (let i = 0; i < sequence.length; i++) {
if (sequence[i] in sequences) break;
sequences[sequence[i]] = sequence.slice(i);
}
return sequence;
}
function drawPath(seq) {
resetMatrix()
translate(width/4, height - 80)
rotate(startingAngle)
let next;
for (let j=0; j<seq.length; j++) {
if (j < (seq.length - 1)) {
next = seq[j + 1]
} else {
next = seq[j]
}
if (seq[j] * 2 == next) {
rotate(angle * 2)
} else {
rotate(-angle)
}
line(0, 0, 0, -offset)
translate(0, -offset)
}
}
function setup() {
sequences = {};
createCanvas(10000, 10000);
background(0, 0, 0, 0);
colorMode(HSB)
startingAngle = -PI * 0.6
angle = 0.08;
offset = height/100
weight = offset * 0.9
N = 10000;
for (let i=4; i<N; i++) {
let seq = collatz(i);
let c = [seq]
c.reverse()
stroke(0, 0, 40)
strokeWeight(weight * 1.3)
drawPath(c)
//reds
//stroke(random(330, 360), random(10,150), random(50,255))
//blues
// stroke(random(210, 270), random(10,150), random(50,255))
//greens
stroke(random(80, 160), random(10,150), random(50,255))
strokeWeight(weight)
drawPath(c)
}
}