class Abstraite et perte de référence.
Salut
Dans le cadre du développement de mon moteur Physique je code mon solver d'équation différentielle. Mais j'ai quelque petit problème j'ai plus de référence alors mettons nous en situation. Alors pour ça j'ai pas classe NumericalSolver
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
template<class T>
class NumericalSolver
{
public :
NumericalSolver(const Vector3D<T> (*f)(const Vector3D<T>, const T), T, Vector3D<T>);
NumericalSolver(const NumericalSolver<T>&);
virtual ~NumericalSolver();
const Vector3D<T> (*dF) (const Vector3D<T>, const T); // dy/dt
Vector3D<T> F; // f
T dt; // différentiel de temps
T Tp; // temps courant
virtual void Next() = 0; /// Fonction virtuelle pour calculer la position suivante
}; |
dF étant un pointeur vers une fonction qui retourne F' F étant un Vecteur 3D exemple :
Code:
1 2 3 4 5 6 7
| const Vector3D<float> Func(const Vector3D<float> v, const float t)
{
// Attracteur de Lorentz
return Vector3D<float>( 10*(v.y-v.x),
28*v.x-v.y-v.x*v.z,
v.x*v.y-8*v.z/3)
} |
Voilà et j'ai plein de classe qui sont des NumericalSolver :
Euler_E, RK4_E, RK6_E, ABM, Gear, ... Exemple avec Euler :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
template<class T>
class Euler_E : public NumericalSolver<T>
{
public :
Euler_E();
Euler_E(const Vector3D<T> &);
virtual ~Euler_E();
void Next(); // F(n+dt)
};
/// Calculer la position suivante
template<class T>
void Euler_E<T>::Next()
{
/// Fn+dt = Fn + dF(F, Tp)*dt
this->F += this->dF(this->F, this->Tp)*this->dt;
this->Tp += this->dt;
} |
Puis j'ai une classe pour la gestion général de la physique :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
template<class T>
class PhysicModel
{
public :
PhysicModel();
PhysicModel(const Vector3D<T> &);
PhysicModel(const Vector3D<T> &, const NS, const T);
virtual ~PhysicModel();
static NS tns;
static NumericalSolver<T> *ns;
void Simulation();
private :
void Choise(const NS, const Vector3D<T> &);
}; |
NS etant la méthode de résolution que nous voulons (NS_EULER_E, NS_RK4_E, ...)
et voilà un bout de l'implémentation :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
|
/// Constructeur
template<class T>
PhysicModel<T>::PhysicModel(const Vector3D<T> &f0, const NS t_ns, const T Dt = 0.01)
{
Choise(t_ns, f0);
ns->F = f0;
ns->dt = Dt;
}
/// Desctruteur
template<class T>
PhysicModel<T>::~PhysicModel()
{
delete ns;
}
/// Lancer le model physique
template<class T>
void PhysicModel<T>::Simulation()
{
ns->Next();
}
/// Choisir le solveur d'ODE
template<class T>
void PhysicModel<T>::Choise(const NS _tns, const Vector3D<T> &f0)
{
switch(_tns)
{
case NS_EULER_E :
ns = new Euler_E<T>(f0);
tns = _tns;
break;
case NS_EULER_I :
ns = new Euler_I<T>(f0);
tns = _tns;
break;
case NS_RK2_E :
ns = new RK2_E<T>(f0);
tns = _tns;
break;
case NS_RK4_E :
ns = new RK4_E<T>(f0);
tns = _tns;
break;
case NS_RK6_E :
ns = new RK6_E<T>(f0);
tns = _tns;
break;
case NS_ABM2_E :
ns = new ABM2_E<T>(f0);
tns = _tns;
break;
case NS_ABM2_I :
ns = new ABM2_I<T>(f0);
tns = _tns;
break;
case NS_ABM3_E :
ns = new ABM3_E<T>(f0);
tns = _tns;
break;
case NS_ABM3_I :
ns = new ABM3_I<T>(f0);
tns = _tns;
break;
case NS_ABM4_E :
ns = new ABM4_E<T>(f0);
tns = _tns;
break;
case NS_ABM4_I :
ns = new ABM4_I<T>(f0);
tns = _tns;
break;
case NS_G2_I :
ns = new Gear2_I<T>(f0);
tns = _tns;
break;
case NS_G3_I :
ns = new Gear3_I<T>(f0);
tns = _tns;
break;
case NS_G4_I :
ns = new Gear4_I<T>(f0);
tns = _tns;
break;
default :
ns = new Euler_E<T>(f0);
tns = NS_EULER_E;
}
} |
voilà et dans mon main je fais :
Code:
1 2 3 4 5 6 7 8 9 10 11
|
VM::PhysicModel<float> *pm = new PhysicModel<float>(F, NS_RK6_E, 0.0003);
pm->ns->dF = Func;
// Dans une fonction Draw :
glBegin(GL_LINE_STRIP);
glVertex3f(pm->ns->F.x, pm->ns->F.y, pm->ns->F.z);
pm->Simulation();
glVertex3f(pm->ns->F.x, pm->ns->F.y, pm->ns->F.z);
glEnd(); |
Mais le problème c'est que j'ai plein de :
Code:
1 2 3 4
| .objs\main.o:main.cpp:(.text+0x470):: undefined reference to `VM::PhysicModel<float>::ns'
)]+0x11d):: undefined reference to `VM::PhysicModel<float>::ns'
)]+0x125):: undefined reference to `VM::PhysicModel<float>::tns'
::~PhysicModel()]+0x11):: undefined reference to `VM::PhysicModel<float>::ns' |
Est ce que vous voyez où je me suis trompez ? Parce que ça me tue de stagné la dessus...