125 lines
3.9 KiB
C++
125 lines
3.9 KiB
C++
// -*- C++ -*-
|
|
|
|
#ifndef MBOSTOCK_CONSTRAINT_H
|
|
#define MBOSTOCK_CONSTRAINT_H
|
|
|
|
#include "shape.h"
|
|
#include "vector.h"
|
|
|
|
namespace mbostock {
|
|
|
|
class Particle;
|
|
class Shape;
|
|
|
|
class Constraints {
|
|
public:
|
|
|
|
/**
|
|
* Constrains a particle a to be distance d from position p, independent of
|
|
* mass.
|
|
*/
|
|
static bool distance(Particle& a, Vector p, float d);
|
|
|
|
/**
|
|
* Constrains two particles a and b to be distance d apart. The particles
|
|
* are moved in opposite directions according to their relative mass, either
|
|
* towards or away from each other, depending on whether their actual
|
|
* distance is greater or less than the specified distance d.
|
|
*/
|
|
static bool distance(Particle& a, Particle& b, float d);
|
|
|
|
/**
|
|
* Constrains a particle a to be at least distance d from position p,
|
|
* independent of mass.
|
|
*/
|
|
static bool minDistance(Particle& a, Vector p, float d);
|
|
|
|
/**
|
|
* Constrains two particles a and b to be at least distance d apart. The
|
|
* particles are moved in opposite directions according to their relative
|
|
* mass, away from each other, if their actual distance is less than the
|
|
* specified distance d.
|
|
*/
|
|
static bool minDistance(Particle& a, Particle& b, float d);
|
|
|
|
/**
|
|
* Constrains a particle a to be at most distance d from position p,
|
|
* independent of mass.
|
|
*/
|
|
static bool maxDistance(Particle& a, Vector p, float d);
|
|
|
|
/**
|
|
* Constrains two particles a and b to be at most distance d apart. The
|
|
* particles are moved in opposite directions according to their relative
|
|
* mass, towards each other, if their actual distance is greater than the
|
|
* specified distance d.
|
|
*/
|
|
static bool maxDistance(Particle& a, Particle& b, float d);
|
|
|
|
/**
|
|
* Constrains the particle so that its y-value is at least min. This
|
|
* implicitly uses a coefficient of restitution of zero.
|
|
*/
|
|
static bool minY(Particle& a, float min) {
|
|
return plane(a, Vector(0, min, 0), Vector(0, 1, 0));
|
|
}
|
|
|
|
/**
|
|
* Constrains the particle so that its y-value is at least min, simulating a
|
|
* collision with a plane of coefficient of restitution kr. Note that the
|
|
* bounce can only be simulated if the particle was previously above the
|
|
* plane.
|
|
*/
|
|
static bool minY(Particle& a, float min, float kr) {
|
|
return plane(a, Vector(0, min, 0), Vector(0, 1, 0), kr);
|
|
}
|
|
|
|
/**
|
|
* Constrains the particle to be above the plane defined by the point p and
|
|
* the normal n. This implicitly uses a coefficient of restitution of zero.
|
|
*/
|
|
static bool plane(Particle& a, Vector p, Vector n);
|
|
|
|
/**
|
|
* Constrains the particle to be above the plane defined by the point p and
|
|
* the normal n, using a coefficient of restitution kr.
|
|
*/
|
|
static bool plane(Particle& a, Vector p, Vector n, float kr);
|
|
|
|
/**
|
|
* Constrains the particle to be inside the specified shape by at least
|
|
* radius r. This implicitly uses a coefficient of restitution of zero.
|
|
*/
|
|
static bool inside(Particle& a, const Shape& s, float r);
|
|
|
|
/**
|
|
* Constrains the particle to be inside the specified shape by at least
|
|
* radius r, using a coefficient of restitution kr.
|
|
*/
|
|
static bool inside(Particle& a, const Shape& s, float r, float kr);
|
|
|
|
/**
|
|
* Constrains the particle to be outside the specified shape by at least
|
|
* radius r. This implicitly uses a coefficient of restitution of zero.
|
|
*/
|
|
static bool outside(Particle& a, const Shape& s, float r);
|
|
|
|
/**
|
|
* Constrains the particle to be outside the specified shape by at least
|
|
* radius r, using a coefficient of restitution kr.
|
|
*/
|
|
static bool outside(Particle& a, const Shape& s, float r, float kr);
|
|
|
|
/**
|
|
* Returns the projection information for the last call to a shape-based
|
|
* constraint.
|
|
*/
|
|
static const Projection& projection();
|
|
|
|
private:
|
|
Constraints();
|
|
};
|
|
|
|
}
|
|
|
|
#endif
|