src/math/integration.js
- import { INTEGRATION_TYPE_EULER } from './constants';
- import { DEFAULT_SYSTEM_DELTA } from '../core/constants';
-
- /**
- * Performs euler integration on the particle.
- *
- * @param {Particle} particle - The particle to integrate
- * @param {number} time - The factor of time to use
- * @param {number} damping - The damping to use
- * @return void
- */
- const eulerIntegration = (particle, time, damping) => {
- if (particle.sleep) {
- return;
- }
-
- particle.old.position.copy(particle.position);
- particle.old.velocity.copy(particle.velocity);
- particle.acceleration.scalar(1 / particle.mass);
- particle.velocity.add(particle.acceleration.scalar(time));
- particle.position.add(particle.old.velocity.scalar(time));
- damping &&
- particle.velocity.scalar(Math.pow(damping, time / DEFAULT_SYSTEM_DELTA));
- particle.acceleration.clear();
- };
-
- /**
- * Performs the chosen integration on the particle.
- * Defaults to euler integration.
- *
- * @param {Particle} particle - The particle to integrate
- * @param {number} time - The factor of time to use
- * @param {number} damping - The damping to use
- * @param {string} [type=INTEGRATION_TYPE_EULER] - The algorithm to use
- * @return void
- */
- export const integrate = (
- particle,
- time,
- damping,
- type = INTEGRATION_TYPE_EULER
- ) => {
- switch (type) {
- case INTEGRATION_TYPE_EULER:
- eulerIntegration(particle, time, damping);
- break;
- default:
- eulerIntegration(particle, time, damping);
- }
- };