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
|
class Vect {
public:
long double x,y,z; // Composantes du vecteur
void def(long double cx,long double cy,long double cz); // Définition des composantes
long double norm(); // Norme du vecteur (longueur)
};
void Vect::def(long double cx,long double cy,long double cz) {
x=cx;y=cy;z=cz;
}
long double Vect::norm() {
return sqrt(carre(x)+carre(y)+ carre(z));
}
class Solid {
public:
void init(); // Initialisation de l'objet
void main(); // Gestion de l'objet à chaque boucle
void display(); // Affichage de l'objet
void calc_ext(); // Calcul de la résultante et du moment des forces extérieures
void move(); // Calcul la nouvelle position
long double m; // Masse
Vect j; // Opérateur d'inertie diagonalisé (composantes de la diagonale)
Vect v; // Vitesse de l'objet
Vect g; // Centre de gravite
Vect w; // Vecteur rotation
Vect4 q; // Quaternion
Matrix p; // Matrice de passage du ref galileen dans le repere lie au solide
Force forces[FORCES_MAX]; // Liste des forces appliquées au solide
Vect forcext; // Résultante des forces extérieures (point d'application=centre de gravite du solide)
Vect momext; // Moment résultant des forces extérieures par rapport au centre de gravite
}
void Solid::init() {
m=0.28; // masse
g.def(0.0,0.0,0.0); // Centre de gravite initial
w.def(0.1,0.1,0.1); // Vecteur rotation initial
v.def(0.0,0.0,0.0); // Vitesse initiale
j.def(2.23,2.23,0.00016); // Opérateur d'inertie
// Forces initiales
for (int i=0;i<FORCES_MAX;i++) {
forces[i].f.def(0.0,0.0,0.0);
forces[i].p.def(0.0,0.0,0.0);
}
// Matrice de passage initiale
p.def(1.0, 0.0, 0.0,
0.0, 0.7, -0.7,
0.0, 0.7, 0.7);
q.def(q0,q1,q2,q3);
}
}
void Solid::move() {
// Translation
g=vectplus(multscalvect(carre(dt)*m,forcext),vectplus(g,multscalvect(dt,v)));
v=vectplus(multscalvect(dt/m,forcext),v);
// Rotation
// Recherche du vecteur rotation
long double a[3][3]={{j.x/dt,0.5*(j.z-j.y),-(momext.x+w.x/dt)},
{j.y/dt,0.5*(j.x-j.z),-(momext.y+w.y/dt)},
{j.z/dt,0.5*(j.y-j.x),-(momext.z+w.z/dt)}};
Vect delta;delta.def(5.0,5.0,5.0);
w=vectplus(w,delta);
}
} |
Partager