up it goes
Log in to post a comment.
const max_y = 70; // min=30, max=90, step=1 const top_h = 25; // min=0, max=20, step=1 const dispersion1 = 1.2; // min=0.1, max=3, step=0.1 const dispersion2 = 6; // min=0.1, max=10, step=0.1 const velocity_y = 0.5; // min=0.1, max=5, step=0.1 const N_circles = 30; // min=10, max=100, step=1 const min_r = 1; // min=0.5, max=10, step=0.1 const max_r = 8; // min=5, max=20, step=0.1 const dt = 0.17; // min=0.01, max=1.0, step=0.01 const hatch_step = 0.2; // min=0.1, max=3.0, step=0.1 const opacity = 0.002; // min=0.001, max=1, step=0.001 const N_frames = 3000; // min=1000, max=10000, step=100 Canvas.setpenopacity(-opacity); const t = new Turtle(); const min_y = 100 const w = 10 const towers_cx = [-50, 0, 50] const towers_circles = [] for (let j = 0; j < towers_cx.length; j++) { cx = towers_cx[j] towers_circles[j] = [] for (let i = 0; i < N_circles; i++) { towers_circles[j].push({x: cx + w/2 * (-1 + 2 * Math.random()), y: min_y, r: min_r}) } } function add_segment(segments, add_s) { let new_segments = [] let min_x = add_s.x1 let max_x = add_s.x2 for (let s of segments) { if ((s.x2 < add_s.x1) || (add_s.x2 < s.x1)) { new_segments.push(s) } else { min_x = Math.min(min_x, s.x1) max_x = Math.max(max_x, s.x2) } } new_segments.push({x1: min_x, x2: max_x}) return new_segments } function intersect_circles_y(circles, y) { segm_x = [] for (let c of circles) { let dy = y - c.y if ((dy > -c.r) && (dy < c.r)) { let dx = Math.sqrt(c.r**2 - dy**2) segm_x = add_segment(segm_x, {x1: c.x - dx, x2: c.x + dx}) } } return segm_x } function walk(frame) { for (let j = 0; j < towers_cx.length; j++) { for (let i = 0; i < N_circles; i++) { if (towers_circles[j][i].y <= -max_y) { let phi = 2 * Math.PI * Math.random() let psi = Math.PI * (-0.5 + Math.random()) let dx = dispersion2 * Math.cos(psi) * Math.cos(phi) let dy = dispersion2 * Math.sin(psi) towers_circles[j][i].x += dx * dt towers_circles[j][i].y = Math.max(towers_circles[j][i].y, -(max_y + top_h)) towers_circles[j][i].y += dy * dt towers_circles[j][i].r = max_r } else { let phi = 2 * Math.PI * Math.random() let dx = dispersion1 * Math.cos(phi) towers_circles[j][i].x += dx * dt towers_circles[j][i].y -= velocity_y * dt towers_circles[j][i].r = min_r + (max_r - min_r) * (min_y - towers_circles[j][i].y) / (min_y + max_y) } } shift = 0;//hatch_step / (towers_cx.length - 1) * j for (let y = -100 + shift; y <= 100; y += hatch_step) { segm_x = intersect_circles_y(towers_circles[j], y) for (let s of segm_x) { t.jump(s.x1, y) t.goto(s.x2, y) } } } // for (let c of circles) { // t.jump(c.x, c.y - c.r) // t.circle(c.r) // } return (frame < N_frames) }