Ich habe eine 4x4-Transformationsmatrix M und möchte die Form einer Kugel herausfinden, wenn sie von M transformiert wird. (Die Kugel befindet sich am Ursprung und hat den Radius 1.)
Ich weiß, dass ich das Zentrum finden kann, indem ich M mit (0,0,0,1) multipliziere.
Der Radius wird jedoch zu einem Problem, da M die Kugel quetschen und drehen kann. Wie kann ich die neuen Radien des resultierenden Ellipsoids ermitteln? Gibt es eine Möglichkeit, die Orientierung herauszufinden?
Insbesondere muss ich die Größe der Begrenzungskugel kennen, die die transformierte Kugel einschließen würde. Mit anderen Worten, was ist das Maximum von | M * V - M * (0,0,0,1) |, wobei V ein Einheitsvektor ist (ein Punkt auf der ursprünglichen Kugel).
mathematics
matrix
transformation
linear-algebra
CaptainCodeman
quelle
quelle
Antworten:
Mathematisch wird die Menge, nach der Sie fragen, als Operatornorm bezeichnet . Leider gibt es keine einfache Formel dafür. Wenn es sich um eine ganz allgemeine affine Transformation handelt - zum Beispiel wenn sie eine beliebige Kombination von Rotationen und ungleichmäßigen Skalen in beliebiger Reihenfolge haben könnte - dann gibt es leider nichts anderes, als eine Singularwertzerlegung zu verwenden . Wenn Sie SVD auf Ihre Matrix anwenden, ist der größte Singularwert der maximale Radius des resultierenden Ellipsoids. Die anderen singulären Werte sind auch die beiden anderen Radien, und das SVD-Verfahren kann auch die Ausrichtung der Achsen für Sie extrahieren.
Die Implementierung von SVD ist nichts für schwache Nerven, da Eigenwerte gefunden werden müssen. Wenn Sie nur die Singularwerte selbst wollen, sind sie die Quadratwurzeln der Eigenwerte von M ^ T * M. Wenn Sie also einen 3x3-Eigenwertlöser zur Hand haben oder nichts dagegen haben, einen zu schreiben, können Sie diesen verwenden. Wenn Sie auch die Ausrichtungen der Achsen extrahieren möchten, wird dies komplizierter, da Sie auch Eigenvektoren finden müssen. In diesem Wikipedia-Artikel finden Sie eine Liste mit Links zu Bibliotheken für SVD, von denen Sie möglicherweise einen in Ihrem Projekt verwenden können.
Wenn die Form Ihrer Matrix so eingeschränkt ist, dass eine ungleichmäßige Skalierung höchstens einmal auftritt und die erste Transformation angewendet wird, dh ganz rechts, wenn Sie Spaltenvektoren verwenden, können Sie dies vereinfachen, um nur die Längen der Matrix zu betrachten transformierte Achsenvektoren. Allein in diesem Fall - dh einer einzelnen ungleichmäßigen Skala, gefolgt von einer beliebigen Folge von Rotationen, Reflexionen und gleichmäßigen Skalen - erhalten Sie die richtige Antwort, wenn Sie nur die Achsenvektoren betrachten.
quelle
Extrahieren Sie möglicherweise Skalierungsfaktoren aus der Matrix und verwenden Sie dann den Maximalwert ihrer Komponenten. Mit der SRT-Matrix (Scale-Rotation-Translation) können Sie dies folgendermaßen tun:
(basierend auf http://wklej.org/id/950061/ - der Name ist decomposeTRS und nicht decomposeSRT, da ich Namen verwende, die in der Reihenfolge angegeben sind, in der die Matrizen in OpenGL multipliziert werden).
Jetzt können Sie den ursprünglichen Kugelradius mit scaleFactor multiplizieren und haben Ihre Begrenzungskugel.
quelle