105 lines
1.7 KiB
C++
105 lines
1.7 KiB
C++
// -*- C++ -*-
|
|
|
|
#ifndef MBOSTOCK_FORCE_H
|
|
#define MBOSTOCK_FORCE_H
|
|
|
|
#include "vector.h"
|
|
|
|
namespace mbostock {
|
|
|
|
class Particle;
|
|
|
|
class UnaryForce {
|
|
public:
|
|
virtual ~UnaryForce() {}
|
|
|
|
void apply(Particle& p);
|
|
|
|
virtual Vector force(const Particle& p) = 0;
|
|
};
|
|
|
|
class BinaryForce {
|
|
public:
|
|
virtual ~BinaryForce() {}
|
|
|
|
void apply(Particle& a, Particle& b);
|
|
|
|
virtual Vector force(const Particle& a, const Particle& b) = 0;
|
|
};
|
|
|
|
class RandomForce : public UnaryForce {
|
|
public:
|
|
RandomForce(float k);
|
|
|
|
virtual Vector force(Particle& p);
|
|
|
|
private:
|
|
float k_;
|
|
};
|
|
|
|
class GravitationalForce : public UnaryForce {
|
|
public:
|
|
GravitationalForce(float g);
|
|
|
|
virtual Vector force(const Particle& p);
|
|
|
|
private:
|
|
float g_;
|
|
};
|
|
|
|
class LinearDragForce : public UnaryForce {
|
|
public:
|
|
LinearDragForce(float kd);
|
|
|
|
virtual Vector force(const Particle& p);
|
|
|
|
private:
|
|
float kd_;
|
|
};
|
|
|
|
class QuadraticDragForce : public UnaryForce {
|
|
public:
|
|
QuadraticDragForce(float kd);
|
|
|
|
virtual Vector force(const Particle& p);
|
|
|
|
private:
|
|
float kd_;
|
|
};
|
|
|
|
class HookeForce : public BinaryForce {
|
|
public:
|
|
HookeForce(float r, float ks);
|
|
|
|
virtual Vector force(const Particle& a, const Particle& b);
|
|
|
|
private:
|
|
float r_;
|
|
float ks_;
|
|
};
|
|
|
|
class DampenedHookeForce : public BinaryForce {
|
|
public:
|
|
DampenedHookeForce(float r, float ks, float kd);
|
|
|
|
virtual Vector force(const Particle& a, const Particle& b);
|
|
|
|
private:
|
|
float r_;
|
|
float ks_;
|
|
float kd_;
|
|
};
|
|
|
|
class CoulombForce : public BinaryForce {
|
|
public:
|
|
CoulombForce(float e);
|
|
|
|
virtual Vector force(const Particle& a, const Particle& b);
|
|
|
|
private:
|
|
float e_;
|
|
};
|
|
|
|
}
|
|
|
|
#endif
|