2017-07-21 2 views
-1

Ich habe 3 Punkte: A, B, C im 3D-Raum. AC = BC in der Länge. Sie repräsentieren ein Dreiecksobjekt namens T. Jeder Punkt ist ein Tupel von Schwimmern, die seine Koordinaten darstellen. T ist platziert wie Median Punkt von A und B ist in Achsen Ursprung bereits.Dreieck Drehung mit Python

In meiner API kann ich T global, das heißt in Bezug auf eine globale Achse zu einer Zeit, für die Rotation drehen. Pseudocode für diese API ist wie:

T.rotate('x', angle) für T um globale x Achse Winkelwert zu drehen, mit der rechten Hand-Regel.

Meine Frage ist für den Code T wie zu drehen:

  • A und B sind auf x Achse
  • C auf y Achse

ist nehme ich ich 3 Anrufe benötigen nacheinander zum Drehen um jede der Achsen. Aber ich habe Probleme, die Winkel nach Anfangspunktkoordinaten zu berechnen.

+0

Bitte geben Sie weitere Details, wie Beispiel Eingänge und gewünschte Ausgänge. Auch, was bedeuten "Medianpunkt von A und B" und "in Achsenherkunft"? (Ein Median ist kein Punkt: meinst du mittleren Punkt? Und ist dieser Mittelpunkt garantiert am Ursprung?) Woher weißt du, dass es möglich ist, zu tun, was du willst? (Es scheint mir im Allgemeinen nicht möglich zu sein, ohne weitere Operationen oder Einschränkungen für T. Für Letzteres muss der Ursprung der Fuß der Höhe von Punkt C zu Seite AB sein.) Welche Arbeit haben Sie bisher geleistet? und welchen Code hast du ausprobiert? –

+0

Entschuldigung, ich meinte wirklich Mittelpunkt. Und mit Achsen Ursprung meine ich das Zentrum der Achsen, (0,0,0) AB Mittelpunkt ist sicherlich in (0,0,0) – user1941583

+0

Wenn Sie Midpoint dann was Sie fragen ist nur möglich, wenn Seitenlänge AC gleich Seite Länge BC - dh AB ist die Basis eines gleichschenkligen Dreiecks. Es kann nur dann mit Drehungen um die Hauptachsen arbeiten, wenn der Ursprung der Fuß der Höhe von C nach AB ist - d.h. nur wenn der Vektor von A nach B senkrecht zum Vektor vom Ursprung nach C ist. Dies ist wahr, weil alle deine Rotationen den Ursprung an Ort und Stelle belassen, und am gewünschten Ende wird die von mir angegebene Situation wahr sein. Wenn Sie die Bedingung ändern, kann ich Ihnen eine Antwort geben, aber keine Antwort ist jetzt möglich. –

Antwort

0

BEARBEITET, um Winkelberechnungen einzuschließen.

Da Sie in Ihrer Frage keinen echten Code angeben, gebe ich nur einen Algorithmus und Winkel an. Wenn Sie Ihre Frage mit Code verbessern, kann ich meinen eigenen Code hinzufügen.

Um zu klären, müssen wir Länge AC gleich Länge BC haben, und der Mittelpunkt der Seite AB muss der Ursprung sein. Letzteres bedeutet, dass die Koordinaten der Punkte A und B einander negativ sind. (Eigentlich sind die wirklichen Anforderungen, dass der Vektor OC wo O ist der Ursprung senkrecht zum Vektor AB und Ursprung ist in Zeile AB. Ihre Bedingungen strenger sind als diese.)

Lassen Sie uns sagen, dass an jedem Punkt der Koordinaten von A sind (Ax, Ay, Az) und ähnlich für B und C.

Bewegen Sie zuerst den Punkt A in die xy-Ebene. Tun Sie dies mit einer Drehung aller drei Punkte um die x-Achse. Aufgrund der Bedingungen befindet sich der Punkt B ebenfalls in der xy-Ebene. Ein möglicher Winkel der Rotation ist -atan2(Az, Ay) obwohl andere auch möglich sind. Überprüfen Sie, ob die resultierenden Werte Az und Bz in Fließkomma-Genauigkeit Null oder nahe beieinander liegen.

Zweitens, führen Sie eine Drehung um die z-Achse durch, um den Punkt A zur x-Achse zu bewegen (und die anderen Punkte entsprechend). Der Punkt B wird nun auch auf der x-Achse angezeigt. Ein Drehwinkel hierfür ist -atan2(Ay, Ax). Überprüfen Sie die resultierenden Ay und By.

Drittens und letzten, führen Sie eine Drehung um die x-Achse durch, um Punkt C auf die y-Achse zu verschieben. Die Punkte A und B sind von dieser letzten Drehung nicht betroffen.Ein Drehwinkel hierfür ist -atan2(Cz, Cy). Überprüfen Sie das Ergebnis Cx (das vor dieser letzten Drehung Null sein sollte) und Cz.

Ihr Dreieck befindet sich jetzt in der gewünschten Position, sofern Ihr ursprüngliches Dreieck die Bedingungen tatsächlich erfüllt. Beachten Sie, dass dieser Algorithmus keine Drehung um die y-Achse verwendet hat: Er wurde nicht benötigt, obwohl Sie meine ursprüngliche Drehung um x durch eine um y ersetzen könnten, wenn Sie möchten.

+0

Ich hatte eine Lösung wie diese ausgearbeitet. Ich sehe, dass Sie 3 Rotationen mit Alpha, Beta, Gamma-Winkel verwenden. Wenn man bedenkt, dass wir mathematische Standardfunktionen wie cos, sin, tan, acos, asin, atan plus Abstandsfunktionen zwischen Punkten usw. verwenden können, frage ich mich, wie man Alpha, Beta und Gamma aus den Koordinaten A, B und C berechnen und anwenden kann Sie. – user1941583

+0

@ user1941583: Ich habe die Winkel aufgenommen. Nur 'atan2' oder' atan' und die Koordinaten werden benötigt. Ich bevorzuge "atan2", da dies mögliche Ausnahmen vermeidet. –

+0

Ihre Lösung ist elegant und unkompliziert. Leider ist es inkrementell. Das heißt, soweit ich verstehe, muss ich bei jedem Schritt die neuen Koordinaten neu entdecken. – user1941583