1 /** 2 * Constructs a new drag force with the specified constant. 3 * 4 * @class Implements a drag force, simulating friction. The drag force is 5 * applied in the opposite direction of the particle's velocity. Since Position 6 * Verlet integration does not track velocities explicitly, the error term with 7 * this estimate of velocity is fairly high, so the drag force may be 8 * inaccurate. 9 * 10 * @extends pv.Force 11 * @param {number} k the drag constant. 12 * @see #constant 13 */ 14 pv.Force.drag = function(k) { 15 var force = {}; 16 17 if (!arguments.length) k = .1; // default drag constant 18 19 /** 20 * Sets or gets the drag constant, in the range [0,1]. The default drag 21 * constant is 0.1. The drag forces scales linearly with the particle's 22 * velocity based on the given drag constant. 23 * 24 * @function 25 * @name pv.Force.drag.prototype.constant 26 * @param {number} x the new drag constant. 27 * @returns {pv.Force.drag} this, or the current drag constant. 28 */ 29 force.constant = function(x) { 30 if (arguments.length) { k = x; return force; } 31 return k; 32 }; 33 34 /** 35 * Applies this force to the specified particles. 36 * 37 * @function 38 * @name pv.Force.drag.prototype.apply 39 * @param {pv.Particle} particles particles to which to apply this force. 40 */ 41 force.apply = function(particles) { 42 if (k) for (var p = particles; p; p = p.next) { 43 p.fx -= k * p.vx; 44 p.fy -= k * p.vy; 45 } 46 }; 47 48 return force; 49 }; 50