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
dF étant un pointeur vers une fonction qui retourne F' F étant un Vecteur 3D exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 };
Voilà et j'ai plein de classe qui sont des NumericalSolver :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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) }
Euler_E, RK4_E, RK6_E, ABM, Gear, ... Exemple avec Euler :
Puis j'ai une classe pour la gestion général de la physique :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; }
NS etant la méthode de résolution que nous voulons (NS_EULER_E, NS_RK4_E, ...)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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> &); };
et voilà un bout de l'implémentation :
voilà et dans mon main je fais :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; } }
Mais le problème c'est que j'ai plein de :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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();
Est ce que vous voyez où je me suis trompez ? Parce que ça me tue de stagné la dessus...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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'
Partager