boids/boids.mjs

80 lines
1.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import Vector from './vector.mjs';
const findNeighbors = (boids, boid, radius) =>
{
const neighbors = [];
for (let otherBoid of boids)
{
if (boid != otherBoid)
{
const dist = boid.pos.sub(otherBoid.pos).normSquared();
if (dist < radius * radius)
{
neighbors.push(otherBoid);
}
}
}
return neighbors;
};
export const update = (boids, params, time) =>
{
for (let boid of boids)
{
const visible = findNeighbors(boids, boid, params.visibleDist);
const close = findNeighbors(boids, boid, params.closeDist);
// Attract towards center of visible flock
const center = new Vector(0, 0);
for (let otherBoid of visible)
{
center.addMut(otherBoid.pos);
}
if (visible.length >= 1)
{
center.divMut(visible.length);
boid.vel.addMut(center.sub(boid.pos).mul(params.centerAccel));
}
// Attract toward center of screen
boid.vel.addMut(boid.pos.mul(-0.01));
// Repel away from close boids
for (let otherBoid of close)
{
boid.vel.addMut(boid.pos
.sub(otherBoid.pos)
.mul(params.repelAccel));
}
// Match other boids velocity
const velocity = new Vector(0, 0);
for (let otherBoid of visible)
{
velocity.addMut(otherBoid.vel);
}
if (visible.length >= 1)
{
velocity.divMut(visible.length);
boid.vel.addMut(velocity.sub(boid.vel).mul(params.matchAccel));
}
// Do not surpass maximum speed
const speed = boid.vel.normSquared();
if (speed > params.maxSpeed * params.maxSpeed)
{
boid.vel.divMut(Math.sqrt(speed)).mulMut(params.maxSpeed);
}
boid.pos.addMut(boid.vel.mul(time));
}
};