forces/LinearDrag.js

import { Force } from './Force.js';

/**
 * @import { ForceConfig } from './Force.js';
 */

/**
 * LinearDrag configuration options.
 * Includes all properties from {@link ForceConfig}.
 * @typedef {object} LinearDragConfig
 * @property {number} [drag=0.99] Friction coefficient where 0 means no drag and higher values slow particles down faster.
 */

/**
 * Environmental force that applies linear drag (friction) to slow down particles over time.
 * @class
 * @extends Force
 */
export class LinearDrag extends Force {
    /**
     * Friction coefficient where 0 means no drag and higher values slow particles down faster.
     * @type {number}
     */
    drag;

    /**
     * Initializes a linear drag with a specified friction coefficient.
     * @constructor
     * @param {LinearDragConfig} [config={}] LinearDrag configuration options.
     */
    constructor(config = {}) {
        super(config);

        this.drag = config.drag ?? 0.99;
    }

    /**
     * Reduces a particle's velocity over time using linear damping.
     * @override
     * @param {object} particle Particle instance to affect.
     * @param {number} dt Time elapsed since the last frame (in seconds).
     * @returns {void}
     */
    apply(particle, dt) {
        particle.vx -= particle.vx * this.drag * dt;
        particle.vy -= particle.vy * this.drag * dt;
    }
}