2016-08-09 54 views
2

Gibt es eine kürzere Möglichkeit, die Transformation anzuwenden?Kürzerer Weg, um Transformation auf Matrix anzuwenden, die Vektoren in Eigen enthält?

auto vecs = Matrix<float, Dynamic, 3>(); //vector in each row. 
Affine3f transform = ...; // some Affine3 transform 

for (int r = 0; r < vecs.rows(); r++) { 
    Vector3f v = vecs.row(r); 
    v = transform * v; 
    vecs.row(r) = v; 
} 
+0

Mit kürzer meinen Sie so etwas wie die drei Zeilen in Ihrer for-Schleife zu einem zusammenzufassen? - 'vecs.row (r) * = transformieren? –

+0

@JohnnyHenly Das ist äquivalent zu 'vecs.row (r) = vecs.row (r) * transform;' was im Allgemeinen nicht äquivalent ist! – immibis

+0

For-Schleife sieht für eine Matrix-Bibliothek wie Eigen sehr überflüssig aus. Ich würde erwarten, dass es eine bessere Funktion gibt, die die for-Schleife zu einem einzigen Funktionsaufruf zusammenfasst. – JE42

Antwort

1

@ JE42 ist richtig, for Schleifen sind fast nie notwendig mit Eigen. Es ist sicherlich möglich zu vereinfachen. Beachten Sie jedoch, dass transform * v in Ihrem Fall keine einfache Multiplikation ist, sondern eine affine Transformation, die transform.linear() * v + transform.translation() entspricht. https://eigen.tuxfamily.org/dox-devel/group__TutorialGeometry.html

Auch Ihre "Punkte" sind Zeilen, so dass zusätzliche Transpositionen benötigt werden.

In der Summe (ohne tatsächlich zu kompilieren oder testen es) Ihre Berechnung sollten

vecs.transpose() = (transform.linear() * vecs.transpose()).array() + transform.translation(); 
0

gleichwertig sein können Sie direkt eine Affine in einer Matrix gespeichert auf einen Satz von Spaltenvektoren Transformation anzuwenden. Da Ihre Vektoren auf einer Reihe angeordnet sind, müssen Sie die Matrix transponieren. Ihre For-Schleife reduziert sich also auf: