Mouarf bon comme j´ai rien à faire je vais essayer de te traduire group rotation
Comme il était expliqué plus en détails dans le paragraphe : " Quaternions et rotation spatiale". La multiplication de quaternions non-nuls se fait par par la conjugaison sur la copie de R^3 comprenant des quaternions avec une partie réelle nulle. ( là je suis vraiment sur de rien niveau traduction
) . La conjugaison par un quaternion unitaire ( avec une valeur absolue de 1) avec une partie réelle cos(t) est une rotation par un angle 2t, l´axe de la rotation étant la direction de la partie imaginaire. Les avantages des quaternions sont :
1. Pas de représentation singulière ( comparer avec les angles d´Euler pour exemples)
2. Plus compact et rapide que les matrices
3. Une paire de quaternions unitaires peut représenter une rotation dans un espace à quatre dimensions
L´ensemble des quaternions unitaires forment une sphère en trois dimensions S^3 et un groupe ( groupe de Lie) sous la multiplication. S^3 est la double cover ( ?) du groupe SO(3,R) des matrices orthogonales réelles 3x3 et de déterminant 1 tandis que deux quaternions unitaires peuvent représenter toutes les rotations sous les conditions ci-dessus. Le groupe S^3 est isomorphe au groupe SU(2), le groupe des complexes de matrices unitaires 2x2 et de déterminant 1.
Supposons que A soit l´ensemble des quaternions de la forme a + bi + cj + dk ( où a, b, c et d peuvent être soit tous entiers soit tous rationnels avec un numérateur bizarre et de dénominateur 2). L´ensemble A est un anneau et un treillis ( à mon avis à comprendre comme un tissage). Ils sont 24 quaternions unitaires dans cet anneau… après je ne comprends pas.
Voilà, à toi de comprendre ce que tu veux, moi je me suis bien marré ![]()
et ben moi aussi je me suis bien marré
il y aurais qqun qui a deja utilisé ca ?
LGV t´es là ?
Je suis nul en quartenions... a l´occas, j´aimerais bien apprendre a m´en servir.
La méthode que je vais te donner est différente ( vetcorielle et matricielle)
Moi je vais te donner autre chose :
( je fais la fonction a la volée, l´algorithme est formel pas vérifiée, de plus, j´emploie des fonctions que tu devas implémenter)
void Rotation(float *x,float *y,float *z,float nx,float ny,float nz,float mx,float my,float mz,float a)
{
point A(nx,ny,nz); / / point de départ de ton axe de rotation
point B(mx,my,mz); / / point d´arrivée
point P(*x,*y,*z); / / point a faire tourner.
vecteur z(A,B); / / vecteur directeur de ton axe.
normalise(z); / / faut que la norme vale 1.
point O = projection_orthogonale_point_sur_vecteur(P,A,z); / / te trouve le point projeté orthogonal de P sur ton vecteur.
vecteur x(O,P); / / vecteur x du repere, non normalisé.
vecteur y = produit_vectoriel(z,x); / / y fera la meme norme que x.
point resultat = O + x*cos(a) + y*sin(a); / / je te renvoie a l´algebre des vecteurs, c´est tres facile.
}
Je te fais la fonciotn délicate suivante :
point projection_orthogonale_point_sur_vecteur(point P,point A,vecteur z)
{
float k;
/ / k sera le parametre ou le point O sera sur z avec A comme origine.
/ / OP.z = 0 --> produit scalaire < => OPx*zx + OPy*zy + OPz*zz = 0
/ / < => ( Px-Ax-k*zx)*zx + ( Py-Ay-k*zy)*zy + ( Pz-Az-k*zz)*zz =0
/ / 1 equation, 1 inconnue ( k)
/ / < => Px*zx-Ax*zx - k*zx² + Py*zy-Ay*zy - k*zy² + Px*zz-Ax*zz - k*zz² = 0
k = ( Px*zx-Ax*zx + Py*zy-Ay*zy + Px*zz-Ax*zz)/(zx²+zy²+zz²);
return A+k*z; / / point O retourné.
}
Je te laisse vérifier les calculs, il se peut qu´ils soient faux ( j´ai fait ça de tete rapidos)
ouais mais en programmation c´est toujours l´idée qui compte, apres c´est au programmeur de mettre en place et d´optimiser !
nb est ce que ce truc est dans ton tuto ?
pcq en fait, comme j´ai pas le net chez moi, j´ai ramené tout ton tuto dans mon ordi, et donc c´est pour savoir si ca vaut la peine que je ramène cette page ci aussi ?
cet algo de rotation n´est pas dans mon tuto
( pas encore)
un jour, peut etre, ferais je une lib de maths...
si ca t´interesse j´ai fait une classe qui gère une chaine de caractère ( qui est sencée représenter une formule de math comme 3*2+sin(x+1)-ln(2) ) et qui renvoie la valeur de la fonction en fonction de la valeur du x fournie indépendamment. C´est peut etre pas du tout opptimisé maisfaudrait que tu vois si ca peut t´interesser ( elle est pas tout à fait finie, mais il ne manque pas grand chose...)
mais bon je suis qu´un débutant, en fait j´aurais plutot du te demander de jetter un oeuil et de me dire ce que tu en pense plutot que de te demander si ca t´interesse... ![]()
bien ça ! une classe d´analyse de chaine ? de maths ![]()
Apres, si elle marche bien, rien ne t´empeche de faire des fonctions de factorisation, de devloppement, de dérivée...
Comme ça, tu reprogrammes Maple ![]()
j´ai essayé la dérivation formelle, mais c´est tout plein de cas particulier ![]()
Attend les primitives ! ![]()
ouais mais ca c´est déja du calcul symbolique de haut vol, ca ne se programme pas du tout de la même manière. Je ne sais pas du tout comment ca marche mais ce que je vois, c´est qu´il faut bien 1/4 de seconde pour que ma calculette en calcul symbolique fasse 1+1 alors que c´est infinitésimal dans la mode de calcul normal ! C´est bien la preuve que ca tourne tout autrement...
le_duche > en fait, tout est basé sur une analyse de grammaire ( oui, c´ets le mot) et ensuite ta chaine est sous forme d´arbre ![]()
a partir de la, tu la manipule bien mieux
exemple :
2* ( 3 + 5)
le pere, c´est le *, a gauche tu as le 2
a droite tu as le +
et les 2 fils de + sont 3 et 5 . ..
je bosse en ce moment ( ´passe sur le net entre deux compilations..) et n´ai pas vraiment le temps de me lancer dans des explications detaillees ; j´essayerai cependant de te trouver un lien potable en francais sur les quaternions et les rotations.
ouais j´ai un peu codé comme ca pour mon analyse de chaine:
En gros, quand je pard de ma chaine de départ
3*sin(2+5*x)+ln(2+3)
je la transforme en deux listes pointées
+ * v s + v * v x v
et
3 2 5 1.6094379
cad que je transforme en notation polonaise et chaque fois que je rencontre une valeur réelle je met un v et je calcule cette valeur queje rajoute dans ma deuxième liste.
de plus chacune de mes fonction est codée par une seule lettre ( s pour sin(), l pour ln(),...) de facon à avancer d´un caractère à chaque étape
oki LGV ![]()
http://membres.lycos.fr/villemingerard/Type/ImagQuat.htm
je sais pas si c´est pcq je suis sous Linux mais ta page est complètement buguée au niveau des caractères... et c´est incompréensible !
essaye celle la p-e alors http://artemmis.univ-mrs.fr/cybermeca/Formcont/mecaspa/SCAO/QUATERN/QUATERN0.HTM :-?
Oui le_duche car moi c´est parfait.