Started by trying to draw a planet. Ended with this... thing.
Log in to post a comment.
// LL2021
Canvas.setpenopacity(1);
const phase = 0.8; // min=0 max=10 step=0.01
const rings = 100; // min=10 max=500 step=1
const precision = 2000; /// min=10 max=2000 step=1
const turtle = new Turtle();
const min_size = 0;
const min_factor = 0;
const max_size = 70;
const max_factor = 20; // min=0 max=50 step=0.1
const fbm_factor = 6; // min=1 max=30 step=0.1
const power = 20; // min=1 max=50 step=0.1
function walk(i, t) {
if (i==0) turtle.jump(0, 0);
const radius1 = min_size + (max_size - min_size) / (rings - 1) * i;
const radius2 = min_size + (max_size - min_size) / (rings - 1) * (i+1);
const factor1 = min_factor + (max_factor - min_factor) * Math.pow(i / (rings - 1), power);
const factor2 = max_factor + (min_factor - max_factor) * Math.pow(i / (rings - 1), power);
drawRing(radius1, radius2, factor1, factor2, t);
return i < rings;
}
function drawRing(radius1, radius2, factor1, factor2, t) {
const astep = 1/precision;
for (var a = 0; a < 1 + astep/2; a += astep) {
const angle = a * Math.PI * 2;
const angle_t = t * Math.PI * 2;
const height = getHeight(phase + 0.01 + angle + angle_t);
const radius = radius1 + (radius2 - radius1) * a;
const r = Math.max(radius / 2, radius + height * factor1 + height * factor2 * factor1);
const x = r * Math.cos(angle);
const y = r * Math.sin(angle);
turtle.goto(x, y);
}
}
function getHeight(a) {
//return fbm(a * fbm_factor);
return Math.max(0.05, Math.pow(fbm(a * fbm_factor), 2));
}
function fbm(x) {
const octaves = 5;
var v = 0;
var a = 0.5;
var shift = 100;
for (var i = 0; i < octaves; i++) {
v += a * noise(x);
x = x * 2.0 + shift;
a *= 0.5;
}
return v;
}
function noise(p) {
const fl = Math.floor(p);
const fc = p - Math.trunc(p);
const r1 = rand(fl);
const r2 = rand(fl + 1);
return r1 + (r2 - r1) * fc;
}
function rand(n) {
const s = Math.sin(n) * 43758.5453123;
return s - Math.trunc(s);
}