2017-07-21 3 views
-1

J'ai 3 points: A, B, C dans l'espace 3D. AC = BC de longueur. Ils représentent un objet triangle appelé T. Chaque point est un tuple de flottants représentant ses coordonnées. T est placé tel que le point médian de A et B est déjà dans l'origine des axes.Rotation de triangle avec Python

Dans mon API, je peux faire tourner T globalement, c'est-à-dire par rapport à un axe global à la fois, pour la rotation. pseudocode pour cette API est comme:

T.rotate('x', angle) pour faire tourner T autour de l'axe global x de valeur d'angle, avec la règle de la main droite.

Ma question est le code de rotation T tels que:

  • A et B sont sur x axe
  • C est sur y axe

Je suppose que je vais devoir 3 appels successivement, pour tourner autour de chacun des axes. Mais j'ai des problèmes pour représenter les angles par les coordonnées initiales des points.

+0

Veuillez donner plus de détails, tels que les exemples d'entrées et les sorties désirées. En outre, que signifient "point médian de A et B" et "origine des axes"? (Une médiane n'est pas un point: voulez-vous dire mi-point? Et ce point médian est-il garanti à l'origine?) Comment savez-vous qu'il est possible de faire ce que vous voulez? (Cela ne me semble pas possible en général sans plus d'opérations ou de limitations sur T. Pour ce dernier, l'origine doit être le pied de l'altitude du point C au côté AB.) Enfin, quel travail as-tu fait jusqu'ici? et quel code as-tu essayé? –

+0

désolé, je voulais dire vraiment point milieu. Et avec l'origine des axes, je veux dire le centre des axes, (0,0,0) AB point milieu est certainement en (0,0,0) – user1941583

+0

Si vous voulez dire milieu, alors ce que vous demandez est possible seulement si la longueur côté AC est égale à côté longueur BC - ie AB est la base d'un triangle isocèle. Il ne peut travailler avec des rotations autour des axes principaux que si l'origine est le pied de l'altitude de C à AB-i.e. seulement si le vecteur de A à B est perpendiculaire au vecteur de l'origine à C. Cela est vrai parce que toutes vos rotations laissent l'origine en place, et à la fin désirée la situation que je déclare sera vraie. Si vous changez la condition je peux vous donner une réponse, mais aucune réponse n'est possible maintenant. –

Répondre

0

EDITED pour inclure les calculs d'angle.

Puisque vous ne fournissez aucun code réel dans votre question, je vais juste fournir un algorithme et des angles. Si vous améliorez votre question avec du code, je peux ajouter du code.

Pour clarifier, il faut avoir une longueur égale à la longueur ACBC, et le milieu de côté AB doit être l'origine. Ce dernier signifie que les coordonnées des points A et B sont des négatifs les uns des autres. (En fait, les besoins réels sont que le vecteur OCO est l'origine est perpendiculaire au vecteur AB et cette origine est conforme AB. Vos conditions sont plus strictes que cela.)

Disons que, à tout moment, le coordonnées de A sont (Ax, Ay, Az) et de même pour B et C.

D'abord, déplacez le point A vers le plan xy. Pour ce faire, effectuez une rotation des trois points autour de l'axe des x. En raison des conditions, le point B sera également dans le plan xy. Un angle possible de la rotation est -atan2(Az, Ay) bien que d'autres sont également possibles. Vérifier que les valeurs résultantes Az et Bz sont nulles ou proches de celle-ci en précision à virgule flottante. Ensuite, effectuez une rotation autour de l'axe z pour déplacer le point A vers l'axe des x (et les autres points de manière appropriée). Le point B sera maintenant également sur l'axe des x. Un angle de rotation est -atan2(Ay, Ax). Vérifiez les résultats Ay et By. Troisièmement, faites une rotation autour de l'axe des x pour déplacer le point C vers l'axe des ordonnées. Les points A et B ne seront pas affectés par cette dernière rotation.Un angle de rotation est -atan2(Cz, Cy). Vérifiez le résultat Cx (qui aurait dû être zéro avant cette dernière rotation) et Cz.

Votre triangle est maintenant dans la position souhaitée, à condition que votre triangle d'origine remplisse les conditions. Notez que cet algorithme n'utilisait aucune rotation autour de l'axe des y: il n'était pas nécessaire, bien que vous puissiez remplacer ma rotation initiale autour de x par une autour de y si vous le souhaitez.

+0

J'avais élaboré une solution comme celle-ci. Je vois que vous utilisez 3 rotations, avec des angles alpha, bêta, gamma respectivement. Considérant que nous pourrions utiliser des fonctions mathématiques standard, comme cos, sin, tan, acos, asin, atan, plus les fonctions de distance entre les points, etc., je me demande comment calculer alpha, bêta et gamma à partir des coordonnées A, B, C leur. – user1941583

+0

@ user1941583: J'ai inclus les angles. Seulement 'atan2' ou' atan' et les coordonnées sont nécessaires. Je préfère 'atan2' car cela évite les exceptions possibles. –

+0

Votre solution est élégante et directe. Malheureusement, c'est incrémental. C'est, autant que je comprends, à chaque étape je dois redécouvrir les nouvelles coordonnées. – user1941583