updateParticles = () => {
for (let i = 0; i < particles.length; i++) {
let p = particles[i];
p.age += 1;
if (p.age >= p.life) {
const randX = d3.randomUniform(lons[0], lons[lons.length - 1])();
const randY = d3.randomUniform(lats[0], lats[lats.length - 1])();
p.x = randX;
p.y = randY;
p.age = 0;
p.xt = randX;
p.yt = randY;
p.life = 30 + Math.random() * 30;
continue;
}
if (p.x < lons[0]) {
p.x = lons[lons.length - 1];
} else if (p.x > lons[lons.length - 1]) {
p.x = lons[0];
}
if (p.y < lats[0]) {
p.y = lats[lats.length - 1];
} else if (p.y > lats[lats.length - 1]) {
p.y = lats[0];
}
const xIndex = Math.min(Math.max(wScale(p.x), 0), data.u[0].length - 1);
const yIndex = Math.min(Math.max(hScale(p.y), 0), data.u.length - 1);
const vx = (data.u[yIndex][xIndex] * data.factor) / data.maxSpeed;
const vy = (data.v[yIndex][xIndex] * data.factor) / data.maxSpeed;
p.xt = p.x + vx;
p.yt = p.y + vy;
}
}