paths = {
noise.seed(seed)
const TAU = Math.PI * 2
const particles = []
const PERIOD = 1/frequency
const STEP = step
const PART_STEPS = part_steps
const SQN = 40
const NPART = SQN * SQN
const FINENESS = 1
const DAMPING = damping
for (let i = 0; i < NPART; i++) {
particles.push({
x: Math.random() * W - W/2,
y: Math.random() * H - H/2,
})
}
const M = 0.3
const f = (x, y) => 5
const xfn = (n, x, y) => {
return Math.sin(n)
}
const yfn = (n, x, y) => {
return Math.cos(n)
}
const paths = particles.map(initial => {
let pa = []
let p = {x:initial.x, y:initial.y, vx:0, vy:0}
for (let i = 0; i < PART_STEPS * FINENESS; i++) {
const dist = Math.sqrt(p.x*p.x/500/500 + p.y*p.y/500/500)
const a = Math.atan2(p.y, p.x) + TAU/4
const n = noise.perlin2(p.x * PERIOD, p.y * PERIOD) * f(p.x, p.y)
p.vx += lerp(dist, xfn(n, p.x, p.y), Math.cos(a)) * STEP
p.vy += lerp(dist, yfn(n, p.x, p.y), Math.sin(a)) * STEP
p.x += p.vx / FINENESS
p.y += p.vy / FINENESS
p.vx *= DAMPING; p.vy *= DAMPING
pa.push([p.x, p.y])
if (p.x < -W || p.x > W || p.y < -H || p.y > H) break
}
return pa
})
return paths
}