(Niveau Lycée ou supérieur?)
Pour la réalisation d'un algorithme, j'ai besoin d'implémenter un système de rotation de figures géométriques simples (carré, rectangle, triangles).
J'ai donc choisi dexprimer les coordonnées des points des figures par leur distance au centre de la figure ainsi que l'angle avec l'axe des abscisse.
Ainsi pour faire pivoter la figure je n'aurais qu'a augmenter la valeur de ces angles.
En théorie tout fonctionne, mais pas en pratique.
Dans le cas des triangles non équilatéraux, j'ai une perte de précision pendant les calculs non négligeable (parfois 25% !!)
Voici la procédure suivie:
Je possède initialement les coordonnées cartésiennes des trois points.
Je calcul les coordonnées cartésiennes du centre :
Xg = (Xa + Xb + Xc) / 3;
Yg = (Ya + Yb + Yc) / 3;
Je calcul ensuite les distances de ces points au centre du triangle :
Sqrt((Xb - Xa)² + (Yb - Ya)²);
ainsi que les trois angles du triangle à l'aide du théorème d'Al Kashi :
A^CB = arccos ( (a² + b² - c²) / (2ab));
Je divise les valeurs des angles obtenus par deux et j'applique les derniers changements :
angleC = PI - 2*angleB - angleC;
angleA = angleA + PI;
angleB = angleB * -1;
J'ai donc maintenant les distances des trois points du triangle par rapport au centre ainsi que les angles correspondant.
J'applique une rotation d'un angle lambda (on va dire 0rad pour faire simple et montrer les problèmes, mais ça pourrait être n'importe quelle valeur).
Puis je reconverti les couples distance+angle en coordonnées cartésiennes pour le traitement et l'affichage : (pour A)
x = cos(angleA)* distanceA + Xg;
y = sin(angleA)* distanceA + Yg;
Et là je me dis c'est niquel, ça fonctionne, mais il n'en est rien !
En effet, si je prends un triangle rectangle ayant ses côtés de longueur 3 4 et 5, avec les positions cartésiennes initiales suivante :
A(0, 0)
B(3, 0)
C(3, 4)
après passage à la moulinette trigonométrique, j'obtiens ces coordonnées :
A(-0.14993539954628, 0.258365633560193)
B(3.17851130197758, 0.154822031355754)
C(2.90061707240709, 4.03518455055459)
Il y a bien un air de ressemblance, mais la marge d'erreur est beaucoup trop grande ! Impossible d'utiliser correctement l'algorithme si les dimensions des triangles sont modifiées dès le début du processus. :mur:
à priori la perte d'info viendrait du passage par cos et arccos, puisque les distances ne sont données que par un simple calcul et ne changent jamais.
Ou alors suis-je complètement a côté de la plaque et il est normal que les résultats ne concordent pas?
Comment puis-je augmenter la précision du processus?
J'ajouterais qu'il n'y a aucun problème avec les triangles équilatéraux.
Pour info, je code en C#
