```  1 /**
2  * Constructs a new bound constraint. Before the constraint can be used, the
3  * {@link #x} and {@link #y} methods must be call to specify the bounds.
4  *
5  * @class Constrains particles to within fixed rectangular bounds. For example,
6  * this constraint can be used to constrain particles in a physics simulation
7  * within the bounds of an enclosing panel.
8  *
9  * <p>Note that the current implementation treats particles as points, with no
10  * area. If the particles are rendered as dots, be sure to include some
11  * additional padding to inset the bounds such that the edges of the dots do not
12  * get clipped by the panel bounds. If the particles have different radii, this
13  * constraint would need to be extended using a radius function, similar to
15  *
16  * @see pv.Layout.Force
17  * @extends pv.Constraint
18  */
19 pv.Constraint.bound = function() {
20   var constraint = {},
21       x,
22       y;
23
24   /**
25    * Sets or gets the bounds on the x-coordinate.
26    *
27    * @function
28    * @name pv.Constraint.bound.prototype.x
29    * @param {number} min the minimum allowed x-coordinate.
30    * @param {number} max the maximum allowed x-coordinate.
31    * @returns {pv.Constraint.bound} this.
32    */
33   constraint.x = function(min, max) {
34     if (arguments.length) {
35       x = {min: Math.min(min, max), max: Math.max(min, max)};
36       return this;
37     }
38     return x;
39   };
40
41   /**
42    * Sets or gets the bounds on the y-coordinate.
43    *
44    * @function
45    * @name pv.Constraint.bound.prototype.y
46    * @param {number} min the minimum allowed y-coordinate.
47    * @param {number} max the maximum allowed y-coordinate.
48    * @returns {pv.Constraint.bound} this.
49    */
50   constraint.y = function(min, max) {
51     if (arguments.length) {
52       y = {min: Math.min(min, max), max: Math.max(min, max)};
53       return this;
54     }
55     return y;
56   };
57
58   /**
59    * Applies this constraint to the specified particles.
60    *
61    * @function
62    * @name pv.Constraint.bound.prototype.apply
63    * @param {pv.Particle} particles particles to which to apply this constraint.
64    */
65   constraint.apply = function(particles) {
66     if (x) for (var p = particles; p; p = p.next) {
67       p.x = p.x < x.min ? x.min : (p.x > x.max ? x.max : p.x);
68     }
69     if (y) for (var p = particles; p; p = p.next) {
70       p.y = p.y < y.min ? y.min : (p.y > y.max ? y.max : p.y);
71     }
72   };
73
74   return constraint;
75 };
76 ```