zwei verschiedene Positionen eines starren Koerpers lassen sich nach
Euler verstehen als eine reine Rotation um eine Achse. Wenn ich nun die
Anfangs- und Endposition verschiedener Punkte des Koerpers kenne, wie
kann man die Rotationsachse und den Winkel um diese Achse berechnen?
Danke fuer jeden Hinweis,
Gruss,
Thomas
> zwei verschiedene Positionen eines starren Koerpers lassen sich nach
> Euler verstehen als eine reine Rotation um eine Achse. Wenn ich nun die
> Anfangs- und Endposition verschiedener Punkte des Koerpers kenne, wie
> kann man die Rotationsachse und den Winkel um diese Achse berechnen?
Indem Du parallele Kreise Kreise durch diese Punkte "malst", deren
Mittelpunkte auf einer Linie liegen.
Anderer Ansatz: Du Zerlegst die Rotation in drei Rotationen um die x,y und
z Achse (genaugesagt um eine Achse parallel zu dieser). So wird das Problem
von drei auf zwei Dimensionen zurückgeführt.
Gruß
Roland
--
Mit dem Rad durch das Globale Dorf: http://www.ImpetusInMundum.de
Die Rotation wird durch eine Rotationsmatrix bestimmt.
Der Ortsvektor nach der Rotation ist das Produkt aus Rotationsmatrix und
Ortsvektor vor der Rotation. Die Rotationsmatrix kannst Du bei mehreren
vermessenen Punkten gut über einen Least-Squares-Fit bestimmen.
Wie Du aus der Rotationsmatrix Drehachse und Drehwinkel herausfindest,
steht z.B. in http://www.physik.tu-dresden.de/ipmk/REB_Anleitung.pdf
Michael Dahms
f'up2 dsim, Crossposting ohne f'up2 ist Böse[TM]
Thomas Zander hat geschrieben:
> zwei verschiedene Positionen eines starren Koerpers lassen
> sich nach Euler verstehen als eine reine Rotation um eine
> Achse. Wenn ich nun die Anfangs- und Endposition
> verschiedener Punkte des Koerpers kenne, wie kann man die
> Rotationsachse und den Winkel um diese Achse berechnen?
Wenn du nur die Positionen und nicht die zugehörigen
Orientierungen kennst, ist das oblem nicht eindeutig lösbar.
Wenn sich der Körper jedoch zwischendurch um einen bekannten
Winkel gedreht hat, ist dieses genau der Winkel, um den sich
der Körper um den Mittelpunkt des Kreises gedreht hat. Der
kann auch Null sein, in dem Fall ist der Radius unendlich.
Jedenfalls wenn der Rotationswinkel bekannt ist, ist es nicht
schwer, den Radius zu bestimmen.
CU Rollo
Wenn Du zwei Punkte hast, von denen einer nicht auf der Rotationsache
liegt, dann ist das Problem eindeutig lösbar.
x und y seien zwei Punkte (Vektoren) auf dem Körper. 0 und 1 bezeichne
vor und nach der Rotation.
(x0+x1)-(y0+y1) müßte die Rotationsachse sein.
Michael Dahms
> Wenn du nur die Positionen und nicht die zugehörigen
> Orientierungen kennst, ist das oblem nicht eindeutig lösbar.
Nicht unbedingt.
Das Problem kann auch eindeutig Lösbar sein oder keine Lösung besitzen.
Thomas gab nicht an, wie viele Punkte ihm bekannt sind. Angenommen er hat
die Bewegung von zwei Punkten Angegeben, die Positionen der Punkte
zueinander bleiben erhalten und die Punkte sind unterscheidbar. Dann kann
man in einer Projektion der Punkte auf eine Ebene zu jedem Punkt eine
Kreisschar angeben, die durch den Anfangs- und Endposition geht. Die
Mittelpunkte einer jeden dieser Kreisscharen liegen auf einer Geraden. Der
Schnittpunkt der Geraden, so er existiert, ist der Drehpunkt für die
gesuchte Drehung. Macht man es drei Mal für drei Dimensionen, so hat man
die Drehachse und -winkel.
> Stimmt das? Kommt nicht noch eine Translation parallel zur Rotationsachse
> hinzu, so daß sich eine Schraubenbewegung ergibt? Ich kann mir jedenfalls
> nicht vorstellen, daß man die Positionsveränderung einer Schraube im
> Gewinde, bei der die Lage der Rotationsachse offensichtlich klar ist, ohne
> die achsiale Verschiebung beschreiben kann.
Ein starrer Körper hat 6 Freiheitsgrade, die man durch Verschiebung des
Schwerpunktes gegen einen raumfesten Bezugspunkt und die Rotation eines
körperfesten (am geschicktesten wählt man ein Hauptträgheitsachsensystem)
Dreibeins gegen ein raumfestes Dreibein parametrisiert. "Raumfest" bedeutet
bzgl. dabei ruhend bzgl. eines Inertialsystems. Näheres in der Kreisel-FAQ:
http://theory.gsi.de/~vanhees/faq/kreisel/kreisel.html
--
Hendrik van Hees Fakultät für Physik
Phone: +49 521/106-6221 Universität Bielefeld
Fax: +49 521/106-2961 Universitätsstraße 25
http://theory.gsi.de/~vanhees/ D-33615 Bielefeld
Das hatte ich übersehen. Ich dachte bei dem Begriff 'Punkt'
nur an die Position des Körpers. Also einen Punktförmigen
Körper.
CU Rollo
der Hinweis, zunaechst die Rotationsmatrix zu bestimmen und mit Hilfe
des links Winkel und Achse zu berechnen, hat mir schonmal sehr viel
weiter geholfen. Danke. Leider ist mir eine Sache nicht klar: Die Achse,
die ich mit Hilfe der angegebenen Formel ausrechnen kann, ist ja nur ein
einziger Vektor. Das Beispiel unten hat aber eine Achse, die durch (1,2)
geht:
Geg.: Ein Stab auf der Zeichenebene mit den Endpunkten A1(1,1,0) und
B1(1,3,0).
Die Endposition sei A2(0,2,0) und B2(2,2,0). (Damit sich niemand ueber
Rotationen um die Laengsachse beschweren kann sei C1(1,1,1) und
C2(0,2,1).)
Die Rotationsmatrix habe ich berechnet, sie lautet:
-1 1 0
2 0 0
0 0 1
Daraus ergibt sich ein Rotationswinkel von 90 Grad und eine
Rotationsachse von (0,0,0.5).
Die Achse (naemlich irgend eine Senkrechte zur Zeichenebene) stimmt
zwar, aber die Rotation geschah um den Punkt (1,2,x). Der Vektor
(0,0,0.5) ist hingegen beliebig platziebar.
Wie geht denn?
Gruss,
Thomas
Welche Punkte des Körpers werden durch Rotation des Körpers nicht
beeinflußt? Das ist die Postition der Rotationsachse. Du muß die jenigen
Punkte x bestimmen für die gilt x = R*x. War das nicht der Eigenvektor?
Ich bin da nicht ganz fit, da ich in meiner Texturzeit immer die
Translationskomponenten ignorieren konnte.
Michael Dahms
>Hallo,
>zwei verschiedene Positionen eines starren Koerpers lassen sich nach
>Euler verstehen als eine reine Rotation um eine Achse. Wenn ich nun die
^^^^^^^
ich nehme das Wort ernst.
>Anfangs- und Endposition verschiedener Punkte des Koerpers kenne, wie
>kann man die Rotationsachse und den Winkel um diese Achse berechnen?
Beispiel:
# Position A
5 0 0
6 0 0
6 0 1
6 1 1
6 1 0
5 1 0
5 1 1
5 0 1
# Position B
20/9 35/9 20/9
8/3 14/3 8/3
16/9 46/9 25/9
17/9 50/9 17/9
25/9 46/9 16/9
7/3 13/3 4/3
13/9 43/9 13/9
4/3 13/3 7/3
# A' * B = (' bedeute die Transponierte)
274/3 628/3 274/3
76/9 178/9 58/9
58/9 178/9 76/9
# Sei A = U * S * V' die SVD (Singulaerwertzerlegung) von A
# U =
0.991836598134175351 -0.082673951419031957 0.097083368083259042
0.090166963466743230 -0.083646586141607873 -0.992407762628871093
0.090166963466743244 0.993060051750959571 -0.075509286286978353
# V =
0.370686405363277960 -0.928758089536156795 0.000000000000000000
0.851576877185908354 0.339881800278242385 -0.399120513231176421
0.370686405363277793 0.147948548356411413 0.916898476341891588
# Berechne Q = V * U' =
0.444444444444444697 0.111111111111110356 -0.888888888888889173
0.777777777777777679 0.444444444444444864 0.444444444444444420
0.444444444444444364 -0.888888888888888840 0.111111111111112187
# rationale Approximation Q=
4/9 1/9 -8/9
7/9 4/9 4/9
4/9 -8/9 1/9
# Verifiziere ||A - B * Q || = 0 !!!
# Ich spektral-zerlege Q und nehme die Eigenvektor zu Eigenwert 1
# als die achse (nochmal rationale Approximation):
# (hmmmmm..... ich hoffe sie sind wirklich rational ....)
2/3
2/3
-1/3
# oder mit meinem lieblingspropgramme matstat (die oberen
# (Berechnungen sind alle innerhalb Editors vi (Vim) mit
# matstat gemacht).
# 3 x 3 normal orthogonal non-involutory invection matrix
# -0.666667 -0.666667 0.333333 (1.570796 rad)
# theta=-1.446441 phi=-0.460554 psi=1.051650 (rad)
# -0.666667 -0.666667 0.333333 (1.570796 rad)
# condition number = 1.000000e+00
# numerical rank (SVD) = 3
# determinant (LU) = 1
# determinant (LDU) = 1
# p: x^3 -1 x^2 +1 x -1
# Frobenius norm = 1.732051
# 2-norm = 1
# 1-norm = 1.666667
# oo-norm = 1.666667
# trace = 1 = 1 + 2 cos 1.570796
Ok, das ist keine Magie, sondern ist ein bekanntes Problem,
das sich ``Procrustes Problem'' nennt. Ich habe das kennengelernt
durch einen Aufsatz von G. W. Stewart [Stewart1992b]. Ich appendiere
hier die relevante Literatur, die ich schonmal gepostet habe.
@article{Higham1986,
author = "Nicholas J. Higham",
year = "1986",
month = "October",
title = "Computing the Polar Decomposition--with Applications",
journal = "SIAM Journal on Scientific and Statistical Computing",
volume = "7",
number = "4",
pages = "1160--1174",
}
@article{Higham1988,
author = "Nicholas J. Higham",
year = "1988",
title = "The Symmetric {P}rocrustes Problem",
journal = "{BIT}",
volume = "28",
pages = "133--143",
}
@Article{Green1952,
author = "B. F. Green",
title = "The Orthogonal Apprroximation of the Oblique
Structure in Factor Analysis",
journal = "Psychometrika",
year = "1952",
month = "December",
volume = "17",
number = "4",
pages = "429--440",
abstract = "A procedure is derived for obtaining an orthogonal
transformation which most nearly transforms one
given matrix into another given matrix, according
to some least-squares criterion of fit. From this
procedure, three analytic methods are derived for
obtaining an orthogonal factor matrix which closely
approximates a given oblique factor matrix. The
case is considered of approximating a specified
subset of oblique vectors by orthogonal vectors.",
}
@article{HurleyCattell1962,
author = "J. R. Hurley and R. B. Cattell",
year = "1962",
title = "The {Procrustes} Program: {Direct} Rotation to Test a
Hypothesized Factor Structure",
journal = "Behavioral Science",
volume = "7",
pages = "258--262",
}
@incollection{Rao1980,
author = "C. Radhakrishna Rao",
year = "1980",
title = "Matrix Approximations and Reduction of Dimensionality in
Multivariate Statistical Analysis",
booktitle = "Multivariate Analysis--V",
editor = "P. R. Krishnaiah",
publisher = "North-Holland",
address = "Amsterdam",
}
@article{Schoeneman1966,
author = "P. H. Sch{\"o}neman",
year = "1966",
title = "A Generalized Solution of the Orthogonal {Procrustes}
Problem",
journal = "Psychometrika",
volume = "31",
pages = "2--10",
}
@Article{ArunHuangBlostein1987,
author = "K. S. Arun and T. S. Huang and S. D. Blostein",
title = "Least-squares fitting of two 3-D point sets",
journal = "IEEE Transactions on Pattern Analysis and Machine Intelligence",
year = "1987",
month = "September",
volume = "9",
number = "5",
pages = "698--700",
}
@Article{Stewart1992b,
author = "Gilbert W. Stewart",
title = "On the Early History of the Singular Value Decomposition
(For Gene Golub on his fifteenth birthday)",
journal = "SIAM Review",
year = "1992",
month = "March",
volume = "35",
pages = "551--566",
}
Rudi
--
Please remove the string s p a r c 2 0 2 to mail me.
(snip)
># Sei A = U * S * V' die SVD (Singulaerwertzerlegung) von A
^^^^^^
soll A' * B = U S V' sein, sorry! oh.... es wird wiede spaet ....
(snip)
BTW. Es lohne sich, die Folgende mal zu lesen. Es gibt elektronische
Exemplare irgendwo da draussen ... (soll einfach zu finden sein.)
Hm, ist nicht jede Kombination aus Rotation um eine Achse A und
Translation auch als reine Rotation um eine Achse B darstellbar?
Michael Dahms
f'up2 dsim
*g* ... 15. Geburtstag ... *g* ......... on his 60. birthday ...
>> journal = "SIAM Review",
>> year = "1992",
>> month = "March",
>> volume = "35",
>> pages = "551--566",
>>}
Danke für den Tip ...
http://citeseer.nj.nec.com/stewart92early.html (Image -> zum online-Lesen ...)
Erstaunlich, daß dabei auch schon E. Beltrami, C. Jordan und J.J. Sylvester
mitgemischt hatten ...
Grüße
Hermann
--
Deine vorgestellte Methode ist wirklich interessant, aber leider habe
ich ein anderes Problem:
>zwei verschiedene Positionen eines starren Koerpers lassen sich nach
>Euler verstehen als eine reine Rotation um eine Achse. Wenn ich nun die ...
^^^^^^
Diese Achse geht leider nicht durch den Ursprung. Die Drehmatrix zu
finden bereitet keine Probleme, wenn ich einen einzigen Punkt auf der
Rotationsachse kenne, aber ich kenne keinen.
Hast Du noch andere Ideen?
Gruss,
Thomas
'Eigenvektor' hat nicht geholfen?
Michael Dahms
Ich hatte zwar vor einigen Tagen geschrieben, dass ich die Drehmatrix
kennen wuerde, aber genaugenommen stimmt das nicht. Ich dachte nur, ich
haette sie. Ich hatte eine Matrix berechnet, die drei meiner Punkte von
Position 1 nach Position 2 verschiebt. Andere Punkte desselben Koerpers
wurden aber mit meiner Matrix nicht richtig gedreht, eben genau deshalb,
weil sich der Koerper nicht um den Ursprung dreht.
Ohne Drehmatrix auch keine Eigenvektoren. Vielleicht komme ich weiter,
wenn ich die Drehmatrix so aufstelle, dass sie sich auf den noch
unbekannten Ursprung (a,b,c) bezieht. Dann muesste ich "nur noch" a, b
und c irgendwie bestimmen.
Dann hast Du die Matrix falsch bestimmt.
Michael Dahms
Nein, das glaube ich nicht. Wenn die Rotation nicht um eine Achse
verlaeuft, die durch den Ursprung geht, dann ist der Ansatz v` = R.v
nicht ausreichend, wenn R eine 3x3 Matrix ist. Dann kann imho dieser
Ansatz nur fuer maximal 3 Punkte gelten. (3 Punkte und deren
parallelverschobenen zum Eigenvektor von R)
Ich denke an den folgenden Ansatz: v`-p = R.(v-p), wobei p der
Ortsvektor zu einem beliebigen Punkt auf der Rotationsachse ist. Ich
koennte nun R in Abhaengigkeit von p1, p2 und p3 berechnen, auch die EV
und EW von R. Da det(R)=1, haette ich sogar eine Gleichung zur
Bestimmung von p, aber eben nur eine, wo ich doch 2 brauche. Welche habe
ich denn vergessen? Das Problem ist doch eindeutig loesbar.
Noch schoener waere eine Loesung, bei der ich nur einfache
Matrizenoperation benoetige. Das obige Rezept (mit der noch fehlenden
Bedingung) liefe auf das Loesen eines nichtlinearen Gleichungssystems
hinaus, das so schlecht zu automatisieren ist.
Noch Ideen?
Schoenes Wochenende aus Berlin,
Gruss,
Thomas
mal wieder Anlaß sich für einen Super Link zu bedanken.
Ein ausgesprochen günstig passender und informativer
Artikel!
Gruß -
Gottfried Helms
Hermann Kremer schrieb:
>
> Nan-Shan Chen schrieb in Nachricht ...
> >
Thomas Zander hat geschrieben:
> [...]
> Noch Ideen?
Bin da nicht so der Experte, mal mal mein Senf zu dem Thema:
Wenn die Drehung um einen Punkt erfolgt und das soll sie ja,
da keine Translation pasieren soll, könnte man folgendermaßen
argumentieren:
Der Punkt A wird auf A' abgebildet. Mittels einer Drehung.
Folglich hat sich der Abstand vom Drehpunkt zu A nicht
verändert. A und A' haben also die gleiche Entfernung zum
Drehpunkt. Allse Punkte, die diese Bedingung erfüllen bilden
also eine Ebene, nämlich diejenige die die Verbindungslinie
A-A' mittig senkrecht schneidet. Die gleiche Argumentation
gilt natürlich auch für die anderen beiden Punkte B und C (die
ja auf B' und C' abgebildet werden). Wir haben also drei
Ebenen - und die schneiden sich in einem Punkt, eben dem
Drehpunkt. Und wenn man den hat, kann man ja alle Koordinaten
so transformieren, daß der Drehpunkt im Koordinatenursprung
liegt und dann die Drehmatrix auszurechnen, scheint ja schon
gelöst zu sein.
Stimmt/hilft das?
CU Rollo
Stimmt nicht ganz!
Nur in 2 Dimensionen dreht man um einen Punkt,
in 3 Dimensionen dreht man um eine *Achse*
(und in 4 Dimensionen um eine Ebene etc...)
Man benötigt also nur 2 Punkte und deren Bildpunkte,
um die Drehachse (wie oben richtig erläutert) und dann auch den Winkel
eindeutig zu bestimmen.
Hat man allerdings mehr als 2 Punkte gegeben und das
vielleicht auch noch mit Meßungenauigkeiten,
sollte man, um diese auszugleichen, schon die bereits im Thread erwähnte
Singulärwertzerlegung (singular value decomposition, SVD)
benutzen.
Schaut Euch doch *bitte* alle noch mal an, was Nan-Shan Chen geschrieben hat!
<news:b1rvrq$6...@getsparc202.uni-paderborn.de>
Und für diejenigen,
die etwas über Bewegungen wissen wollen, empfehle ich die Bücher von
Quaisser, E.; Sprengel, H.-J.
Bewegungen in der Ebene und im Raum
und
Geometrie in Ebene und Raum.
Thomas Mautsch hat geschrieben:
> Stimmt nicht ganz!
> Nur in 2 Dimensionen dreht man um einen Punkt,
> in 3 Dimensionen dreht man um eine *Achse*
> (und in 4 Dimensionen um eine Ebene etc...)
>
> Man benötigt also nur 2 Punkte und deren Bildpunkte,
> um die Drehachse (wie oben richtig erläutert) und dann auch
> den Winkel eindeutig zu bestimmen.
Da stellt sich aber mir wieder die Frage, ob sich wirklich
jede verschiebung/Drehung eines 3D-Objektes im 3D-Raum allein
als eine Drehung um eine Achse beschreiben lässt. Denn wenn
schon 2 Punkte eines Objektes ausreichen, sowohl die Lage als
auch die Richtung der Achse als auch den Rotationswinkel zu
bestimmen, dann bleibt ja kein Freiheitsgrad mehr für den
dritten Punkt des Körpers über, der ja unzweifelhaft nötig
ist, um die genaue neue Lage des Körpers zu beschreiben. Sonst
würde ich ja eine Rotation um die Verbindungslinie AB
unerfasst bleiben.
Hmm. Wenn man einfach mal die Freiheitsgrade zählt:
Die Drehachse kann man (von Sonderfällen abgesehen) mit zwei
Werten beschreiben (Durchstoßpunkt durch die XY-Ebene z.B.).
Die Richtung der Achse ergibt einen 3-Vektor. Über den Betrag
dieses Richtungsvektors kann ich den Drehwinkel codieren.
Alles zusammen komme ich damit auf 5 Freiheitsgrade.
Nun nehmen wir die beiden angeblich durch eine Drehung
ineinander überführbahren Körper: Es sind drei Punkte nötig,
um seine Lage zu beschreiben. Dementsprechend gibt es drei
Differenzvektoren (AA', BB',...) Macht Neun Freiheitsgrade.
Der Körper behält aber seine Form. Also ist |A'B'| kein
Freiheitsgrad mehr weil identisch mit |AB|. Somit gehen also 3
Freiheitsgrade verloren. Bleiben also noch Sechs. Mehr
Einschränkungen fallen mir jetzt aber nicht ein.
Daraus schließe ich, daß ich entweder falsch liege, oder daß
man eine beliebige Drehung + Verschiebung eines 3D-Objektes im
Raum nicht durch eine einfache Drehung um eine Achse
ausdrücken kann. Es fehlt einfach ein Freiheitsgrad: die
Verschiebung längs der Drehachse z.B..
Na ja, vieleicht hätte ich den Thread besser verfolgen sollen.
CU Rollo
Da hätte zusätzlich noch ``bei Drehungen'' stehen müssen.
Mea culpa! - Hatte den Thread nicht sorgfältig gelesen
und dachte, der Schwerpunkt des Körpers (oder irgendein anderer Punkt)
wäre fixiert.
> Da stellt sich aber mir wieder die Frage, ob sich wirklich
> jede verschiebung/Drehung eines 3D-Objektes im 3D-Raum allein
> als eine Drehung um eine Achse beschreiben lässt.
Nein, ist nicht der Fall. Ist genau in einem der Bücher beschrieben,
die ich empfohlen hatte...
[ ... schnipp! - hier wurden freiheitsgrade gezählt ... ]
> Daraus schließe ich, daß ich entweder falsch liege, oder daß
> man eine beliebige Drehung + Verschiebung eines 3D-Objektes im
> Raum nicht durch eine einfache Drehung um eine Achse
> ausdrücken kann. Es fehlt einfach ein Freiheitsgrad: die
> Verschiebung längs der Drehachse z.B..
Genau. - Jede orientierungserhaltende Isometrie des Raumes ist entweder
die Identität, eine Translation, eine Drehung oder eine *Schraubung*,
und wie der Name schon suggeriert, ist eine Schraubung
eine Drehung mit nachfolgender Verschiebung längs der Drehachse. -
Brilliant spekuliert von Dir!
> Na ja, vieleicht hätte ich den Thread besser verfolgen sollen.
Ich auch. Sorry!
Also, der Vorschlag jetzt nochmals:
Erst mit einer Translation
den Schwerpunkt des Körpers in den Schwerpunkt des Bildes abbilden
und dann mit SVD (mit Schwerpunkt als Ursprung)
eine Drehung mit Drehachse durch den Schwerpunkt suchen.
Hoffentlich ist das jetzt richtig...
v` = R.(v) - p
Rotation + Translation wäre richtig.
Einen Punkt der Rotationsache findest Du nach der Methode aus
<10446319...@jupiter.schunter.etc.tu-bs.de>
Ich persönlich ziehe bei überbestimmten Systemen einen Least-Squares-Fit vor.
Michael Dahms
Es war ja nicht die Frage nach einer Achse, die das komplette
Bewegungsverhalten eines Koerpers beschreibt, sondern es gibt einen
Anfangszustand A und einen Endzustand B. Die Positionen zwischen A und B
sind jetzt mal wurscht. Dann gibt es genau eine Achse, die den starren
Koerper von A nach B dreht! Diese Achse geht i. allg. nicht durch den
Ursprung und zeigt i. allg. auch nicht in eine
Koordinatenachsenrichtung. Die Frage war nun nach der Achse und einem
beliebigen Punkt auf dieser Achse, wenn die Lagen des Koerpers komplett
bekannt sind (keine Messungenauigkeiten usw.!).
Das Procruste Problem - soweit ich das verstanden habe - liefert fuer
beliebig viele Punkte eine Transformationsvorschrift fuer genau diese
Punkte, aber nicht fuer andere Punkte, die auch zu dem Koerper gehoeren.
Es liefert nur dann auch fuer andere Punkte die
Transformationsvorschrift, wenn die Drehung um den Ursprung erfolgt.
Bitte korrigiert mich, wenn ich falsch liege. Das Ergebnis des
Procrustes Problem ist doch ein Vektor (EV), der eine Gerade definiert,
die durch den Ursprung geht, kann also nich die Loesung meines Problems
sein, oder?
Gruss,
Thomas
Michael Dahms wrote:
>
> v` = R.(v) - p
>
> Rotation + Translation wäre richtig.
>
Wie meinst Du das? Meintest Du vielleicht v' - p = R.(v) - p?
Was meinst Du mit v und v'? Den Vektor vom Ursprung aus oder von der
Drehachse aus?
> Einen Punkt der Rotationsache findest Du nach der Methode aus
> <10446319...@jupiter.schunter.etc.tu-bs.de>
>
klar, konstruieren und demnach auch berechnen laesst sich die Achse. Ich
brauche, wie beschrieben, nur zwei Ebenen, die jeweils senkrecht auf dem
Verschiebungsvektor stehen sich schneiden zu lassen. Aber ich wollte
doch lieber Matrizenoperationen durchfuehren (lassen) und nicht
Gleichungssysteme aufstellen und loesen, weil das leichter zu
automatisieren ist.
> Ich persönlich ziehe bei überbestimmten Systemen einen Least-Squares-Fit vor.
Mein Problem ist nicht ueberbestimmt. Es handelt sich um FEM-Ergebnisse.
Ich kann beliebig viele Koordinaten angeben, aber auch beliebig wenig
und erhalte fuer die Achse nahezu dieselben Ergebnisse.
Gruss,
Thomas
Nein. '-p' auf beiden Seiten der Gleichung ist unsinnig.
> Was meinst Du mit v und v'?
v und v' sind im (festen) Referenzkoordinatensystem definiert.
> Aber ich wollte
> doch lieber Matrizenoperationen durchfuehren (lassen) und nicht
> Gleichungssysteme aufstellen und loesen, weil das leichter zu
> automatisieren ist.
Ich bin kein Mathematiker, aber: Das Aufstellen und Lösen von linearen
Gleichungssystemen und Matrizenoperationen sind AFAIK das gleiche.
> > Ich persönlich ziehe bei überbestimmten Systemen einen Least-Squares-Fit vor.
>
> Mein Problem ist nicht ueberbestimmt.
Doch. Die Anzahl der Punkte ist größer als die Anzahl der Unbekannten.
Michael Dahms
BTW: Bitte höre auf, die Postings auch zu mailen.
Michael Dahms schrieb:
Im Grunde muss jetzt nur noch für y = M*x+b bei bekannter Rotationsmatrix
der Veschiebevektor ermittelt werden, also b = M*x-y.
Gruss Udo
Den obigen Ansatz verstehe ich nicht. Wenn v gleich p ist (ein Punkt des
Koerpers v liege auf der Drehachse), dann sind die neuen Koordinaten
desselben Punktes bezogen auf das Referenzkoordinatensystem null??
>
> Ich bin kein Mathematiker, aber: Das Aufstellen und Lösen von linearen
> Gleichungssystemen und Matrizenoperationen sind AFAIK das gleiche.
>
Im Prinzip schon, aber Matrizen lassen sich leichter haendeln.
> >
> > Mein Problem ist nicht ueberbestimmt.
>
> Doch. Die Anzahl der Punkte ist größer als die Anzahl der Unbekannten.
>
Dann nehme ich eben weniger Punkte. Nur soviele, wie unbedingt noetig.
raffinierte Idee
>
> ... Es sind drei Punkte nötig,
> um seine Lage zu beschreiben. Dementsprechend gibt es drei
> Differenzvektoren (AA', BB',...) Macht Neun Freiheitsgrade.
> Der Körper behält aber seine Form. Also ist |A'B'| kein
> Freiheitsgrad mehr weil identisch mit |AB|. Somit gehen also 3
> Freiheitsgrade verloren. Bleiben also noch Sechs. Mehr
> Einschränkungen fallen mir jetzt aber nicht ein.
>
Ich weiss aber, dass es eine Drehachse gibt. Welche Information habe ich
denn dadurch zusaetzlich, die ich nicht schon verbraten habe?
>
> Also, der Vorschlag jetzt nochmals:
> Erst mit einer Translation
> den Schwerpunkt des Körpers in den Schwerpunkt des Bildes abbilden
> und dann mit SVD (mit Schwerpunkt als Ursprung)
> eine Drehung mit Drehachse durch den Schwerpunkt suchen.
>
Was hat denn der Schwerpunkt mit der ganzen Angelegenheit zu tun? Den
kenne ich auch gar nicht. Meinst Du vielleicht anstatt Schwerpunkt einen
Punkt der Rotationsachse? Die kenne ich ja auch noch nicht. Ist das dann
nicht wieder genau mein Ansatz:
(v'-p) = R.(v-p)?
v (und v') Lage eines Punktes vor (nach) der Bewegung bezogen auf
globales Koordinatensystem
p Vektor zu einem Ort der Rotationsachse
R Drehmatrix um einen bel. Punkt der Drehachse
Und ja, das hat mit Deinem Ansatz, den Du in diesem Thread gepostet hast,
zu tun.
Am Mon, 03 Feb 2003 16:08:04, schrieb Thomas Zander <zand...@mailbox.tu-berlin.de>:
>
> der Hinweis, zunaechst die Rotationsmatrix zu bestimmen und mit Hilfe
> des links Winkel und Achse zu berechnen, hat mir schonmal sehr viel
> weiter geholfen. Danke. Leider ist mir eine Sache nicht klar: Die Achse,
> die ich mit Hilfe der angegebenen Formel ausrechnen kann, ist ja nur ein
> einziger Vektor. Das Beispiel unten hat aber eine Achse, die durch (1,2)
> geht:
>
> Geg.: Ein Stab auf der Zeichenebene mit den Endpunkten A1(1,1,0) und
> B1(1,3,0).
> Die Endposition sei A2(0,2,0) und B2(2,2,0). (Damit sich niemand ueber
> Rotationen um die Laengsachse beschweren kann sei C1(1,1,1) und
> C2(0,2,1).)
[ Schnipp! - Ab hier habe ich keinen Schimmer,
was Du gerechnet hast. ]
Du suchst keine lineare Abbildung in Vektorräumen,
sondern eine affine Abbildung im affinen Euklidischen Raum.
Rechne deshalb in *affinen Koordinaten*,
d.h. setze vor jeden Punkt als vierte Koordinate eine 1
(und vor jeden Richtungsvektor dementsprechend eine 0):
A1 (1;1,1,0)
B1 (1;1,3,0)
C1 (1;1,1,1)
und als vierter Punkt
D1 = A1 + (B1-A1) x (C1-A1)
= (1;1,1,0) + (0;2,0,0)
= (1;3,1,0)
Für die Bilder:
A2 (1;0,2,0)
B2 (1;2,2,0)
C2 (1;0,2,1)
D2 = A2 + (B2-A2) x (C2-A2)
= (1;0,2,0) + (0;0,-2,0)
Die Abbildung, die Du suchst, bildet A1,B1,C1,D1 auf A2,B2,C2,D2 ab,
erfüllt damit
(1 1 1 1) (1 1 1 1)
M * (1 1 1 3) = (0 2 0 0)
(1 3 1 1) (2 2 2 0)
(0 0 1 0) (0 0 1 0)
Also
( 1 0 0 0)
M = (-1 0 1 0)
( 3 -1 0 0)
( 0 0 0 1)
*Falls* die Abbildung eine Drehung ist,
ergibt sich die Drehachse (Richtung *und* Lage)
aus dem
Nullraum von (M - Einheitsmatrix),
der hier z.B. aufgespannt wird von
(-0.4;-0.4,-0.8,0)
und ( 0; 0, 0,1)
Der Vektor im Nullraum, der als erste der vier Komponenten
Null zu stehen hat, ist die *Richtung* der Achse
(auch als Eigenvektor der 3x3-Matrix,
die in M rechts unten steht, berechenbar).
die Vektoren im Nullraum, die als erste Komponente
eine 1 zu stehen haben, sind die *Punkte* der Achse.
Der Drehwinkel entspricht den komplexen Eigenwerten
der 3x3-Matrix rechts unten in M.
Ich möchte mich Michael Dahms Meinung anschließen. -
Dein Problem, die Drehung zu bestimmen, ist,
wenn Du mehr als je 3 Original- und Bildpunkte hast,
ueberbestimmt und läßt sich nur
mittels Kleinster-Quadrate-Methoden *ordentlich* behandeln.
(Vielleicht überzeugen wir Dich ja.)
Ich dachte, die Ergebnisse einer FEM-Rechnung
wären normalerweise so ungenau, dass man sich ständig Fragen stellen muss,
ob z.B. die Ergebnisse mit Überschlagsrechnungen übereinstimmen...
Kannst Du vielleicht etwas genauer schreiben,
woran Du da arbeitest, an welcher Stelle dieses Problem,
die Rotationsachse zu bestimmen, auftauscht
und woher die Original- und Bildpunkte der Drehung stammen!?
Mich würde auch interessieren, warum Du Dir so sicher bist,
eine Drehung und keine Schraubung vorliegen zu haben.
Kennst Du vielleicht einen Punkt, der von der Abbildung fixiert wirst?
Dann könnte man den Ursprung des Koordinatensystems in diesem Punkt fixieren...
Und wie kannst Du eigentlich sagen, Du erhältst
"fuer die Achse nahezu dieselben Ergebnisse", egal, welche
`Koordinaten' Du benutzt, wenn Du die Achse bisher noch gar nicht
ausrechnen konntest???
Gruß Thomas
Das ist nur der Fall,
wenn die Bewegung (mindestens) einen Punkt des Raumes fixiert läßt.
Ansonsten gibt es da noch Schraubungen, die keinen einzigen Punkte
des Raumes wieder auf sich abbilden.
Das sind gleichzeitige Drehungen um eine Achse und
Verschiebungen entlang dieser Achse. Kein Punkt bleibt dabei fix...
[ ... ]
> (keine Messungenauigkeiten usw.!).
Das wäre das erste Mal in der Menschheitsgeschichte.
> Das Procruste Problem -
[ ... ]
Sorry! - Bin leider kein Numerik-Crack. - Müßte mir das selbst anlesen.
Der kommt bei Kleinsten-Quadrat-Methoden immer raus,
wenn man einen besten Kandidaten für einen Bezugspunkt sucht,
in den man den Koordinatenursprung legt.
> Den
> kenne ich auch gar nicht.
Wenn Du die Koordinaten der Punkte kennst, kannst Du daraus ihren Schwerpunkt
berechnen. Es sind übrigens *zwei* Schwerpunkte, einer im Original und
einer im Bild.
> Meinst Du vielleicht anstatt Schwerpunkt einen
> Punkt der Rotationsachse?
Garantiert nicht.
> Die kenne ich ja auch noch nicht. Ist das dann
> nicht wieder genau mein Ansatz:
>
> (v'-p) = R.(v-p)?
>
> v (und v') Lage eines Punktes vor (nach) der Bewegung bezogen auf
> globales Koordinatensystem
> p Vektor zu einem Ort der Rotationsachse
> R Drehmatrix um einen bel. Punkt der Drehachse
Das ist fast so,
nur dass bei mir p auf der linken Seite der Schwerpunkt der Bildpunkte
und p auf der rechten Seite der der Originale ist.
Dann kommt es bloss noch darauf an,
ein bestmögliches orthogonales R zu bestimmen...
Thomas Zander hat geschrieben:
> > Hmm. Wenn man einfach mal die Freiheitsgrade zählt:
> raffinierte Idee
>
> Ich weiss aber, dass es eine Drehachse gibt. Welche
> Information habe ich denn dadurch zusaetzlich, die ich nicht
> schon verbraten habe?
Mooooment, verstehe ich dich richtig? Also es dürft inzwischen
klar sein, daß sich eine allgemeine Verschiebung/Drehung eines
Starren Körpers im Raum _nicht_ durch eine einfache/einzige
Drehung um _eine_ Achse darstellen lässt.
Sollte nun aber dein Problem so beschaffen sein, daß du mit
sicherheit weißt, daß in deinem Fall es eben doch geht, dann
reduziert sich meine Freiheitenzählerei auf folgendes:
Für die Drehachse ändert sich nichts, es bleiben 5
Freiheitsgrade.
Aber der Körper kann mit nurnoch 2 Punkten beschrieben werden.
Damit haben wir die beiden Verschiebungsvektoren A-A' und
B-B', also 6 Freiheitsgrade und davon geht wieder runter, daß
|AB| = |A'B'| ist/bleibt. Es bleiben also 5 Freiheitsgrade
übrig, was zu denen der Drehung um eine Achse passt. Jetzt
kann man das Problem eindeutig lösen, man hat aber die
Freiheit verloren, den Punkt C beliebig (unter der Bedingung
des starren Körpers) abzubilden. Um diese Rotationsachse zu
bestimmen, braucht man C gar nicht. Will man C auf C'
abbilden, müßte man nach der schon getanen Abbildung eine
Rotation des Körpers z.B. um die Achse A'-B' durchführen. Das
ist dann der eine Freiheitsgrad, den man noch braucht oder
nicht hat oder wie man es auch sehen will.
CU Rollo
Danke fuer Deine Ueberlegungen. Ich beschreibe jetzt mal etwas genauer,
was mein Problem ist:
Es handelt sich darum, die Rotationsachse eines Wirbelkoerpers bezogen
auf die feste Einspannug infolge einer Biegung der Lendenwirbelsaeule
mit einfachem Biegemoment zu berechnen. Das Modell hat mehrere starre
Wirbelkoerper, die mit elastischen Bandscheiben verbunden sind. Der
unterste Wirbelkoerper ist fest eingespannt. Der oberste wird belastet.
Mit der oben beschriebenen Methode (Ebenen konstruieren, die senkrecht
auf dem Verschiebungsvektor stehen. Die Schnittgerade ist die gesuchte
Achse), konnte ich feststellen, dass auch mehrere Ebenen sich (nahezu)
in einer Geraden treffen. Es handelt sich also wirklich um eine Rotation
um eine Drehachse, auch wenn die FEM nicht 100% die Realitaet
wiedergibt, so dass man sich ein Least-Squares-Fit sparen kann.
Original- und Bildpunkte sind bekannt. Da ich die Belastung kenne, weiss
ich sogar die ungefaehre Richtung der Drehachse, sie hat in etwa die
gleiche Orientierung wie der Momentenvektor. Da das Moment in kleinen
Inkrementen aufgebracht wird, kann ich sogar das Wandern der Drehachse
bestimmen. Das Konstruieren der Ebenen und das Bestimmen der
Schnittgeraden ist leider nicht so gut automatisierbar. Die Koordinaten
der Originalkoordinaten und die Verschiebungsvektoren sind jedoch
tabellarisch vorhanden und gut beispielsweise in Mathematica einlesbar
und weiterverarbeitbar. Und das ist genau mein Wunsch: Ein "paar
Matrizenoperationen" und als Ergebnis eine Geradengleichung. Ansonsten
waere der Aufwand zu gross, da ich dass etwa 100 mal machen muss.
Gruss,
Thomas
> Du suchst keine lineare Abbildung in Vektorräumen,
> sondern eine affine Abbildung im affinen Euklidischen Raum.
> Rechne deshalb in *affinen Koordinaten*,
> d.h. setze vor jeden Punkt als vierte Koordinate eine 1
> (und vor jeden Richtungsvektor dementsprechend eine 0):
Hallo Thomas,
das ist des Pudels Kern. Aber das wusste ich bisher nicht. Ich hatte
zwar irgendwo gelesen, wie eine lineare Abbildung definiert ist, aber
anschaulich ist mir das nicht klar. Von *affinen Koordinaten* hatte ich
bisher noch nichts gehoert. Kannst Du mir einfache Literatur dazu
empfehlen?
Jedenfalls danke ich Dir. Das Rezept funktioniert ganz klasse.
Ich fasse das Problem und die Loesung zusammen:
Wie ermittelt man die Achse, um die sich ein starrer Koerper gedreht
hat, wenn 4 Punkte der Anfangs- (A1 bis D1) und Endposition (A2 bis D2)
(exakt) bekannt sind? (Je drei Punkte duerfen nicht auf einer Geraden
liegen.)
Loesung:
Man schreibe die Koordinaten dieser 4 Koordinaten als Spaltenvektoren in
eine Matrix und fuelle die erste Zeile mit einsen (a1j=1).
(1 1 1 1 ) (1 1 1 1 )
M . ( T T T T) = ( T T T T) ; T = transponiert
(A1 B1 C1 D1 ) (A2 B2 B3 B4 )
Der Nullraum von (M - I) (das sind die Loesungsvektoren von (M-I).x = 0,
I ist die Einheitsmatrix) ergibt zwei Vektoren, deren einer mit 1, der
andere mit 0 beginnt.
Ohne die 1 und die 0 handelt es sich um den Orts- und den
Richtungsvektor der Drehachse. Der Drehwinkel entspricht den komplexen
Eigenwerten der Matrix (M - I) ohne die erste Spalte und die erste
Zeile. (Der reale Eigenvektor zu dieser Matrix ist auch der
Richtungsvektor.)
Beispiel:
> A1 (1;1,1,0)
> B1 (1;1,3,0)
> C1 (1;1,1,1)
> D1 (1;3,1,0)
>
> Für die Bilder:
> A2 (1;0,2,0)
> B2 (1;2,2,0)
> C2 (1;0,2,1)
> D2 (1;0,0,0)
>
>
> (1 1 1 1) (1 1 1 1)
> M * (1 1 1 3) = (0 2 0 0)
> (1 3 1 1) (2 2 2 0)
> (0 0 1 0) (0 0 1 0)
>
> Also
> ( 1 0 0 0)
> M = (-1 0 1 0)
> ( 3 -1 0 0)
> ( 0 0 0 1)
>
( 0 0 0 0)
M-I = (-1 -1 1 0)
( 3 -1 -1 0)
( 0 0 0 0)
Nullraum von (M-I) = {0,0,0,1} und {1,1,2,0}
Orstvektor ist also {1,2,0} und Drehachse hat Richtung {0,0,1}
Eigenwerte von (-1 1 0) sind -i, i und 1. i = cos(90)+i*sin(90)
(-1 -1 0) -i = cos(90)-i*sin(90), also
90 Grad Drehung math. pos.
(0 0 0)
Wie bitte? Wenn Du das Stück für Stück hinschreibst, entsteht das zu
lösende Gleichungssystem automatisch.
Michael Dahms
Warum "Wie bitte?" Ich habe doch gar nichts gesagt. Wenn Du es nicht
verstanden hast, dann kannst Du es doch nochmal lesen.
Aber Spass beiseite, das Gleichungssystem ist aber jedesmal ein anderes.
Mal steht hier eine 0, mal dort. Das Aufloesen muss dementsprechend
jedesmal anders durchgefuehrt werden. Aber die Methode mit den affinen
Koordinaten klappt super. Dort braucht man tatsaechlich nur mit
Mathematica ein paar Matrizenoperationen durchfuehren und fertig.
Wie bekommt man eigentlich den link zu einem posting? Ich wuerde gerne
dorthin verweisen.
Danke fuer alle investierten Gedanken,
Gruss,
Thomas
Du kannst den Message-ID der zu zitierenden Nachricht zitieren und
`news:' davorschreiben. Alternativ kannst Du auch
den Link der Nachricht in groups.google.de zitieren.
Zum Beispiel sollten
news:3E48ED6E...@mailbox.tu-berlin.de
und
hoffentlich funktionieren.
Am Tue, 11 Feb 2003 10:56:39, schrieb Thomas Zander <zand...@mailbox.tu-berlin.de>:
>
> Ich beschreibe jetzt mal etwas genauer, was mein Problem ist:
> Es handelt sich darum, die Rotationsachse eines Wirbelkoerpers bezogen
> auf die feste Einspannug infolge einer Biegung der Lendenwirbelsaeule
> mit einfachem Biegemoment zu berechnen. Das Modell hat mehrere starre
> Wirbelkoerper, die mit elastischen Bandscheiben verbunden sind. Der
> unterste Wirbelkoerper ist fest eingespannt. Der oberste wird belastet.
> Mit der oben beschriebenen Methode (Ebenen konstruieren, die senkrecht
> auf dem Verschiebungsvektor stehen. Die Schnittgerade ist die gesuchte
> Achse), konnte ich feststellen, dass auch mehrere Ebenen sich (nahezu)
> in einer Geraden treffen. Es handelt sich also wirklich um eine Rotation
> um eine Drehachse,
Gerade die oberen Wirbel sollten eigentlich nicht nur verdreht,
sondern auch quasi im Vergleich zur Ausgangslage ``auseinandergeschraubt''
aussehen, d.h. verdreht und zusätzlich in Richtung der Rotationsachse
leicht verschoben. Dass Deine Ebenen sich *fast* in einer Gerade treffen,
deutet darauf hin, dass der Verschiebungsanteil der Schraubung nicht groß
ist. Da es aber genauso einfach ist, die Achse einer Verschraubung
wie die einer Drehung auszurechnen, solltest Du Dich nicht unbedingt
darauf versteifen, nur Drehungen ausrechnen zu wollen.
Mehr dazu gleich...
> auch wenn die FEM nicht 100% die Realitaet
> wiedergibt, so dass man sich ein Least-Squares-Fit sparen kann.
Das zweite Argument *für* eine Kleinste-Quadrate-Methode ist,
dass ihre Ergebnisse meist stabiler/genauer/korrekter sind,
als andere Rechenverfahren -
auch, wenn Du nur 3 Original- und 3 Bildpunkte hast
und Dein Problem nicht überbestimmt ist.
Wenn Du allerdings statt 10-25 nur 3 Punkte zur Bestimmung der Bewegung
benutzen willst, sollten sie wenigstens auf einem möglichst großen,
möglichst gleichseitigen Dreieck liegen, glaube ich...
> Original- und Bildpunkte sind bekannt.
Und damit auch ihr (geometrischer) Schwerpunkt, also 1/3 mal die Summe
der Punkte.
> Da ich die Belastung kenne, weiss
> ich sogar die ungefaehre Richtung der Drehachse, sie hat in etwa die
> gleiche Orientierung wie der Momentenvektor. Da das Moment in kleinen
> Inkrementen aufgebracht wird, kann ich sogar das Wandern der Drehachse
> bestimmen. Das Konstruieren der Ebenen und das Bestimmen der
> Schnittgeraden ist leider nicht so gut automatisierbar. Die Koordinaten
> der Originalkoordinaten und die Verschiebungsvektoren sind jedoch
> tabellarisch vorhanden und gut beispielsweise in Mathematica einlesbar
> und weiterverarbeitbar. Und das ist genau mein Wunsch: Ein "paar
> Matrizenoperationen" und als Ergebnis eine Geradengleichung. Ansonsten
> waere der Aufwand zu gross, da ich dass etwa 100 mal machen muss.
>
Ich habe da ein kurzes Matlab-Programm geschrieben
(auch, weil ich Mathematica nicht mehr traue, seit ich neulich
Solve[x^3 == 1, x] und Solve[x^5 == 1, x] damit gerechnet habe...),
würde aber vorher gern noch auf Deine andere Nachricht
news:3E48ED6E...@mailbox.tu-berlin.de
eingehen, werde also das Programm da posten.
> Jedenfalls danke ich Dir. Das Rezept funktioniert ganz klasse.
Das hatte ich befürchtet. Dies ist *nicht* meine Lieblingslösung.
> Ich fasse das Problem und die Loesung zusammen:
>
> Wie ermittelt man die Achse, um die sich ein starrer Koerper gedreht
> hat, wenn 4 Punkte der Anfangs- (A1 bis D1) und Endposition (A2 bis D2)
> (exakt) bekannt sind? (Je drei Punkte duerfen nicht auf einer Geraden
> liegen.)
>
> Loesung:
> Man schreibe die Koordinaten dieser 4 Koordinaten als Spaltenvektoren in
> eine Matrix und fuelle die erste Zeile mit einsen (a1j=1).
>
> (1 1 1 1 ) (1 1 1 1 )
> M . ( T T T T) = ( T T T T) ; T = transponiert
> (A1 B1 C1 D1 ) (A2 B2 B3 B4 )
>
Ich wusste nicht, dass Du Punkte als Zeilenvektoren schreibst.
In diesem Fall kannst Du alternativ auch die Gleichung
( 1 A1 ) ( 1 A2 )
( 1 B1 ) . N = ( 1 B2 )
( 1 C1 ) ( 1 C2 )
( 1 D1 ) ( 1 D2 )
lösen. Die Lösung ist dann N = Mtransponiert
Die Lösung N hat die Form
( 1 b )
( 0 A )
wobei A eine 3x3-Matrix, 0 ein Spaltenvektor aus Nullen und b ein
Zeilenvektor ist.
Die entsprechende Abbildung im 3-dimensionalen Raum
bildet Punkte X (Zeilenvektoren) auf X.A+b ab.
[ ... ]
>
> Nullraum von (M-I) = {0,0,0,1} und {1,1,2,0}
> Ortsvektor ist also {1,2,0} und Drehachse hat Richtung {0,0,1}
>
> Eigenwerte von (-1 1 0) sind -i, i und 1. i = cos(90)+i*sin(90)
> (-1 -1 0) -i = cos(90)-i*sin(90), also
> (0 0 0)
> 90 Grad Drehung math. pos.
Hier besteht noch ein kleines Problem, weil Drehachse und Drehwinkel
eigentlich *zwei* Drehungen um diese Achse bestimmen.
Man kann entscheiden, welche dieser Drehungen die richtige ist,
aber wahrscheinlich ist das praktisch irrelevant...
Das von Nan-Shan Chen (ch...@getsparc202.uni-paderborn.de) hier
gepostete Verfahren zum `Procruste-Problem' setzte voraus,
dass Du weisst, dass der Koordinatenursprung auf der
Drehachse liegt. Falls dem nicht so ist, kann man es anpassen.
Ich könnte etwas dazu schreiben - später...
An dieser Stelle nur die Realisierung als Matlab-Programm:
X = [1,1,0;1,3,0;1,1,1]
Y = [0,2,0;2,2,0;0,2,1]
sX = mean(X,1);
sY = mean(Y,1);
[t,s]=size(X);
X=X-ones(t,1)*sX;
Y=Y-ones(t,1)*sY;
[d,Z,tr]=procrustes(Y,X);
d
A=tr.T
b=sY-sX*A
D=eig(A)'
richtung=null(eye(s)-A)'
aufpunkt=b*pinv(eye(s)-A)
verschiebung=aufpunkt*(A-eye(s))+b
X und Y sind die Matrizen der Original- und Bildpunkte. -
Es können mehr als 3 sein (oder auch nur 2).
sX und sY die Schwerpunkte dieser beiden Punktmengen. -
Da wir wissen, dass die X-Punkte auf die Y-Punkte abgebildet werden sollen,
müssen auch die Schwerpunkte aufeinander abgebildet werden.
Dann werden X und Y so verschoben, dass
die Schwerpunkte im Ursprung liegen.
Jetzt ist eine Bewegung gesucht, die die verschobenen Punkte aufeinander
abbildet, aber diese lässt wegen der vorgenommenen Verschiebung den
Ursprung fest (ist damit eine Drehung).
Wie man diese Drehung berechnet, hat Nan-Shan Chen ausführlich in
news:b1rvrq$6...@getsparc202.uni-paderborn.de
beschrieben.
Hier erledigt das alles der Befehl [d,Z,tr]=procrustes(Y,X);
Das Ergebnis d muss 0 sein,
wenn die Punktmengen in X und Y wirklich kongruent sind.
A und b sind die Bestandteile der Matrix N oben.
Aus den Eigenwerten D kann man den Drehwinkel ablesen.
richtung gibt die Richtung der Drehachse,
aufpunkt einen Punkt auf der Drehachse und
verschiebung ist nur dann ungleich 0,
wenn es sich um keine reine Drehung handelt, und
gibt dann an, wie weit man nach der Drehung
in Richtung der Drehachse verschiebt
(ist für Wirbel vielleicht ganz nützlich zu wissen).
So, das war's. Gruß Thomas