rotation und verschiebung von koordinaten ermitteln
-
kann ich machen ^^
ich habe die aufgabe eine messung auszuwerten,
dabei sind meine p1 die vom pc berechneten soll-positionen und die p2 die gemessenen ist-positionen...
die abweichung von "soll" zu "ist" stelle ich über linien (vektoren p1 zu p2) dar...zur auswertung habe ich nur die koordinaten aus meiner datei,
den drehpunkt berechne ich aus soll-koordinaten...jetzt soll ich aber anhand dieser koordinaten die "korrekturwerte" (rotation, veschiebung, skalierung) berechnen...
also verschiebung und skalierung ist einfach,
nur bei der rotation komm ich grade nicht weiter...irgendwann kommt evtl. auch noch scherung
mit dazu, aber darüber hab ich mir noch keine gedanken weiter gemacht, da ich mit der rotation erstmal genug probleme hab...
Gruß
Schandi
-
Huhu,
also wie jetzt ?
Du hast einen Vektor V in der Ebene mit seinen Koordinaten p1, p2.
Der Vektor V wird jetzt gedreht und eventuell noch verschoben.
Nach Drehung und Verschiebung hat er die Koordinaten p1', p2'.
Richtig ?Jetzt möchtest Du den Drehwinkel rausbekommen, oder ?
Rechne doch erst beide Winkel separat aus und bilde dann die Differenz,
dann hast du den Drehwinkel.Wenn du Lust hast, kannst du auch konkrete Beispiele, also Vektoren mit Koordinaten vorher und nachher aufschreiben, dann können wir das in Quellcode umsetzen.
LG,
p.
-
proggingmania schrieb:
Huhu,
also wie jetzt ?
Du hast einen Vektor V in der Ebene mit seinen Koordinaten p1, p2.
Der Vektor V wird jetzt gedreht und eventuell noch verschoben.
Nach Drehung und Verschiebung hat er die Koordinaten p1', p2'.
Richtig ?Jetzt möchtest Du den Drehwinkel rausbekommen, oder ?
Rechne doch erst beide Winkel separat aus und bilde dann die Differenz,
dann hast du den Drehwinkel.Wenn du Lust hast, kannst du auch konkrete Beispiele, also Vektoren mit Koordinaten vorher und nachher aufschreiben, dann können wir das in Quellcode umsetzen.
hi,
nee nich ganz ^^
mein vektor geht von p1 zu p2,
der vekror an sich wird nicht gedreht/verschoben,
sondern die "ebene" mit allen p2,
mein vektor geht nach der drehung von p1 (bleibt unverändert) nach p2' (neu )...
der vektor hat danach eine andere länge/richtung...
verstehst du jetzt was ich meine?mfg
-
Ok, korrigiere mich bitte, wenn ich falsch liege:
Du hast eine Menge ( 2 bis 599 ) von 2D-Vektoren in der Ebene und genau einen Drehpunkt
D(x;y)Wir betrachten jetzt nur einen Vektor V1 mit Anfangspunkt p1 und Endpunkt p2.
Wir denken uns den Drehpunkt D mit dem Anfangspunkt p1 des Vektors V1 verbunden
und erhalten eine Strecke, bzw einen neuen Vektor V2: Dp1Wir denken uns den Drehpunkt D mit dem Endpunkt p2 des Vektors V1 verbunden
und erhalten eine Strecke, bzw einen neuen Vektor V3: Dp2.Der Endpunkt p2 wird nun um D gedreht, je nach Drehrichtung wird V1 größer oder kleiner,
d.h. sein Betrag ändert sich.Vektor V1 ist genau dann minimal, wenn er mit Dp2 kollinear ist und in die selbe Richtung zeigt,
p2 wird zu p2'.V1 hat dan den minimalen Betrag |Dp2| - |Dp1|, den kann man auch ohne Rotation direkt ausrechnen.
Der heiß begehrte Rotationswinkel, nennen wir ihn mal Phi, bei dem V1 minimal ist,
ist nun der Winkel zwischen Dp1 und Dp2.
Den Winkel könnte man jetzt z.B. mit Hilfe des Kosinussatzes ausrechnen, dafür
braucht man lediglich die drei Punkte im Raum: D(x;y), p1(x1;y1), p2( x2;y2).Nach Anwendung des Kosinussatzes und Umformung ergibt sich für den Winkel Phi:
Phi =
\arccos
\left(
\frac
{(x-x1)2+(y-y1)2+(x-x2)2+(y-y2)2-(x2-x1)2-(y2-y1)2}
{2\cdot((x-x1)2+(y-y1)2)\cdot((x-x2)2+(y-y2)2)}
)\rightGruß,
p.
-
danke für deine hilfe, aber ich glaube ich bin ein hoffnungsloser fall...
auch wenn es vllt ganz einfach ist, ich schaffs nichhab das jetzt versucht mit dieser formel zu berechnen, aber irgendwo ist da ein fehler den ich nicht finde...
double x = 300; double y = 500; double x1= 0; double y1= 0; double x2= 0; double y2= 0; double Phi = 0; double s1 =0; double s2 =0; for(int i=0; i<iAnzahl; i++) { x1= v[i].p1.x1; y1= v[i].p1.y1; x2= v[i].p2.x2; y2= v[i].p2.y2; s1 = (pow((x-x1),2) + pow((y-y1),2) + pow((x-x2),2) + pow((y-y2),2) - pow((x2-x1),2) - pow((y2-y1),2)); s2 = (2 * (pow((x-x1),2) + pow((y-y1),2)) * (pow((x-x2),2) + pow((y-y2),2))); Phi += acos(s1/s2); } Phi /= iAnzahl;
ich bekomme immer einen "Phi" von 1,57xxxx , selbst wenn ich folgendes mache:
x=0; y=0; x1=500; y1=800; x2=500; y2=800; s1 = (pow((x-x1),2) + pow((y-y1),2) + pow((x-x2),2) + pow((y-y2),2) - pow((x2-x1),2) - pow((y2-y1),2)); s2 = (2 * (pow((x-x1),2) + pow((y-y1),2)) * (pow((x-x2),2) + pow((y-y2),2))); Phi = acos(s1/s2);
wenn p1 = p2 ist sollte Phi doch 0 sein und nicht 1,5x
was mache ich falsch ?
gruß
Schandi
-
proggingmania schrieb:
Nach Anwendung des Kosinussatzes und Umformung ergibt sich für den Winkel Phi:
Phi =
\arccos
\left(
\frac
{(x-x1)2+(y-y1)2+(x-x2)2+(y-y2)2-(x2-x1)2-(y2-y1)2}
{2\cdot((x-x1)2+(y-y1)2)\cdot((x-x2)2+(y-y2)2)}
)\rightDu hast die Wurzel vergessen. Korrekt wäre hier
\phi =
\arccos
\left(
\frac
{(x-x1)2+(y-y1)2+(x-x2)2+(y-y2)2-(x2-x1)2-(y2-y1)2}
{2\cdot \sqrt{(x-x1)2+(y-y1)2} \cdot \sqrt{(x-x2)2+(y-y2)2} }
\right)Schandmaul schrieb:
wenn p1 = p2 ist sollte Phi doch 0 sein und nicht 1,5x
was mache ich falsch ?
(s.o.) berücksichtige die Wurzel und Du erhälst
double x=0; double y=0; double x1=500; double y1=800; double x2=500; double y2=800; double s1 = (pow((x-x1),2) + pow((y-y1),2) + pow((x-x2),2) + pow((y-y2),2) - pow((x2-x1),2) - pow((y2-y1),2)); double s2 = (2 * sqrt(pow((x-x1),2) + pow((y-y1),2)) * sqrt(pow((x-x2),2) + pow((y-y2),2))); double Phi = acos(s1/s2);
Phi wird zu 0.
Abgesehen davon bekommt man auf diese Art und Weise für Phi nur positive Werte, da der cos für positive und negative Winkel mit gleiche Betrag gleiche Werte liefert.
Besser ist es, den sin und cos dieses Winkels zu bestimmen und dann die Funktion atan2 zu nutzen. Das Skalarprodukt ist
und das Kreuzprodukt ist
damit kann man phi bestimmen aus
Am besten man bastelt sich eine Vektor-Klasse oder nimmt diese hier - abgespeckt auf 2 Dimensionen.
Apropos; Frage an Schandi - ist der Drehpunkt überhaupt bekannt?
Gruß
Werner
-
Werner Salomon schrieb:
Du hast die Wurzel vergessen. Korrekt wäre hier
Aaaahhhggrrrfrxt ich Dusselvieh ! So ein Anfängerfehler, Schande über mein Haupt !
Werner Salomon schrieb:
Abgesehen davon bekommt man auf diese Art und Weise für Phi nur positive Werte, da der cos für positive und negative Winkel mit gleiche Betrag gleiche Werte liefert.
Ok, sehen wir mal davon ab und sagen: Jepp ! Man bekommt den Winkel, aber die Drehrichtung geht flöten( verloren ).
Ob p1 == p2 ist, würd ich abfragen bevor ich die beiden Punkte an die Formel lasse.Werner Salomon schrieb:
damit kann man phi bestimmen aus
Die letzten beiden Formeln können meine Browser nicht darstellen, daher kann ich da keinen Senf zu beitragen.
An Schandschnute hätt ich auch ne Frage und zwar um was für Messpunkte es sich dabei handelt.
Gruuuhuuß,
p.
-
Werner Salomon schrieb:
Besser ist es, den sin und cos dieses Winkels zu bestimmen und dann die Funktion atan2 zu nutzen. Das Skalarprodukt ist
und das Kreuzprodukt ist
damit kann man phi bestimmen aus
verd*** is das kompliziert...
hätte mir das einfacher vorgestellt...
ich glaube ich muß mir die vektorrechnung doch noch etwas genauer ansehen ^^Werner Salomon schrieb:
Apropos; Frage an Schandi - ist der Drehpunkt überhaupt bekannt?
ja der drehpunkt ist mir bekannt
proggingmania schrieb:
An Schandschnute hätt ich auch ne Frage und zwar um was für Messpunkte es sich dabei handelt.
eigentlich möchte ich nicht zuviel sagen
mache grade ein praktikum und soll die abweichung der datensätze (p1 zu p2) bestimmen...
was und wie gemessen wird darf ich glaube nich sagen...
und da ich nach dem praktikum mit etwas glück weiter dort bleiben darf werd ich erst mal nicht zu viel ausplaudernsicher könnte ich auch im betrieb jemanden fragen, aber erstens haben die eh keine zeit um mir das noch zu erklären, und zweitens fände ich es besser wenn ich das selber irgendwie schaffe...
gruß
Schandi
-
Schandmaul schrieb:
verd*** is das kompliziert...
hätte mir das einfacher vorgestellt...
ich glaube ich muß mir die vektorrechnung doch noch etwas genauer ansehen ^^Hmm - wenn Du das schon kompliziert findest wird's wirklich schwierig.
Schandmaul schrieb:
ja der drehpunkt ist mir bekannt
das macht die Sache ein wenig einfacher, aber nicht wesentlich.
Schandmaul schrieb:
eigentlich möchte ich nicht zuviel sagen
mache grade ein praktikum und soll die abweichung der datensätze (p1 zu p2) bestimmen...
was und wie gemessen wird darf ich glaube nich sagen...
und da ich nach dem praktikum mit etwas glück weiter dort bleiben darf werd ich erst mal nicht zu viel ausplaudernHört sich ja richtig aufregend an; da siehst Du mal wie's mir geht
.
Ok - ich habe inzwischen Rücksprache gehalten. Ich kann Dir zwei Lösungen dazu anbieten. Eine sogenannte geschlossen, die aber mathematisch aufwendig ist und eine numerische - also mit einer Iteration - die aber einfacher zu verstehen ist. Beide Ansätze enthalten aber mehr Mathe als das bisschen Trigonometrie oben. Bist Du noch interessiert? Wenn ja an welcher?
-
Werner Salomon schrieb:
Hmm - wenn Du das schon kompliziert findest wird's wirklich schwierig.
na son ärger, ich werd mir aber mühe geben
Werner Salomon schrieb:
Schandmaul schrieb:
ja der drehpunkt ist mir bekannt
das macht die Sache ein wenig einfacher, aber nicht wesentlich.
nur mal so aus neugierde... heißt das es wäre, wenn bestimmt komplizierter, sogar möglich den drehpunkt irgendwie zu berechnen?
Werner Salomon schrieb:
Hört sich ja richtig aufregend an; da siehst Du mal wie's mir geht
.
Ok - ich habe inzwischen Rücksprache gehalten. Ich kann Dir zwei Lösungen dazu anbieten. Eine sogenannte geschlossen, die aber mathematisch aufwendig ist und eine numerische - also mit einer Iteration - die aber einfacher zu verstehen ist. Beide Ansätze enthalten aber mehr Mathe als das bisschen Trigonometrie oben. Bist Du noch interessiert? Wenn ja an welcher?
ja, ist auch aufregend, aber mit (zu)wenig vorwissen leider auch verdammt schwierig...
aber zum glück gibts ja foren mit gaaaanz netten leuten die einem bei sowas helfen *schleim*und JA ich bin noch interessiert...
bei der frage zu welcher.. hmm... klingt beides nicht einfach...
ich würde gerne die nehmen, die ich leichter "einprogrammieren" kann... *g*und am besten wäre natürlich, wenn du das so schreiben kannst, dass ich das auch verstehe...
ein paar "stichworte" dazu reichen zur not auch, im netz findet man ja fast alles (man muß nur wissen was man sucht)gruß
Schandi
-
Schandmaul schrieb:
nur mal so aus neugierde... heißt das es wäre, wenn bestimmt komplizierter, sogar möglich den drehpunkt irgendwie zu berechnen?
Ja klar - Du kannst alles berechnen, solange der Input ausreicht. Mit einem gegebenen Punkt (2 Freiheitsgrade in der Ebene) kannst Du eine Verschiebung (auch 2 Freiheitsgrade) oder eine Drehung und Skalierung bestimmen; je nach dem was man als gegeben annimmt. Mit 2 Punkten (4 Freiheitsgrade) kann man Verschiebung, Drehung und Skalierung bestimmen und mit 3 Punkten (6 Freiheitsgrade) oder mehr lässt sich Verschiebung, Drehung, Skalierung in x und y und die Scherung berechnen.
Wobei letzteres sogar noch das 'einfachste' ist, weil es eine vollständige lineare Abbildung ist (mit 6 Freiheitsgrade in 2D), und daher keine Nebenbedingungen zu berücksichtigen sind. Die Nebenbedingungen machen das ganze nämlich noch mal schwieriger.
Schandmaul schrieb:
und JA ich bin noch interessiert...
bei der frage zu welcher.. hmm... klingt beides nicht einfach...
ich würde gerne die nehmen, die ich leichter "einprogrammieren" kann... *g*Ok - hat sich inzwschen auch erledigt. Den iterativen Ansatz konnte ich auch lösen - und es kommt tatsächlich das selbe heraus. Dafür wird's aber auch noch einfacher.
Schandmaul schrieb:
und am besten wäre natürlich, wenn du das so schreiben kannst, dass ich das auch verstehe...
ein paar "stichworte" dazu reichen zur not auch, im netz findet man ja fast alles (man muß nur wissen was man sucht)Ich fang' erst mal mit leichter zu programmieren an. Dazu betrachte ich jede Koordinate als komplexe Zahl. Hier ein Beispiel:
#include <cmath> // std::acos #include <complex> #include <iostream> #include <vector> struct Pkt { Pkt() : p1(), p2() {} Pkt( const std::complex< double >& p1_, const std::complex< double >& p2_ ) : p1( p1_ ), p2( p2_ ) {} std::complex< double > p1; // berechnete/vorgegebene Koordinate std::complex< double > p2; // gemessene Koordinate }; int main() { using namespace std; const double RAD2GRAD = 180./acos( -1.0 ); typedef complex< double > Cplx; vector< Pkt > v; // -- 'v' füllen // p1 p2 v.push_back( Pkt( Cplx( 0, 200 ), Cplx( 150, 50 ) ) ); v.push_back( Pkt( Cplx( 10, 200 ), Cplx( 150, 10 ) ) ); v.push_back( Pkt( Cplx( 150, 210 ), Cplx( 140, 200 ) ) ); // usw. Cplx drehpkt( 150, 200 ); // -- Winkel um den 'drehpkt' berechnen Cplx sum_pq; for( vector< Pkt >::iterator iPkt = v.begin(); iPkt != v.end(); ++iPkt ) { sum_pq += conj( iPkt->p1 - drehpkt ) * ( iPkt->p2 - drehpkt ); } cout << "Winkel = " << arg( sum_pq ) * RAD2GRAD << endl; return 0; }
Hier kommt korrekt die erwarteten 90Grad heraus. Die Typen für die Member p1 und p2 habe ich einfach als complex< double > angenommen. Das erleichtert einiges. Im folgenden nenne ich die p1 immer nur p und die p2 immer q; dann tippt's sich leichter in den Formeln.
Berechnet wird ein Richtungsvektor n. Die Formel für diesen Richtungsvektor lautet
\vec n = \frac{{\left[ {\begin{array}{*{20}c} {\sum {\vec p'\vec q'} } \\ {\sum {\vec p' \times \vec q'} } \\ \end{array}} \right]}}{{\sum {\vec p'} }}mit
und
Wobei 'd' der Drehpunkt ist. Die Striche (p', q') lasse ich im folgenden aber auch großzügig weg.In der Schreibweise der komplexen Zahlen sieht das dann so aus
Der Nenner ist eine reelle Zahl, und der Winkel (Funktion arg) einer komplexen Zahl ändert sich nicht, wenn man sie mit einer reellen Zahl multipliziert oder dividiert. Also reicht zur Berechnung des Winkels der Zähler. Und genau das steht oben im Code; sum_pq ist der Nenner in der Formel.Wie kommt man auf sowas? Denke Dir einfach jedes Punktepaar p1, p2 mit einem idealen Gummiband verbunden. Die Punkte p2 (alias q) werden festgehalten und der Körper mit den Punkten p1 (alias p) schwingt sich jetzt in einem Zustand ein, der nur das Energieminimum sein kann. Bestimmt wird also der Winkel um den man den Körper mit den Punkten p drehen muss, bis sich das Energieminimum einstellt. Die Energie einer Feder ist proportional zum Quadrat ihrer Auslenkung. Dann lässt sich schreiben.
S = \sum {\left( {\left[ {\begin{array}{*{20}c} {n\_x } & { - n\_y } \\ {n\_y } & {n\_x } \\ \end{array}} \right] * \left[ {\begin{array}{*{20}c} {p_x } \\ {p_y } \\ \end{array}} \right] - \left[ {\begin{array}{*{20}c} {q_x } \\ {q_y } \\ \end{array}} \right]} \right)^2 }
S ist hier die Summe aller Längenquadrate. Der Drehwinkel steckt in dem 0_T_1 drin. Ausgeschrieben ist dasmit
wenn man das jetzt aus multipliziert und nach n_x und n_y ableitet, so bekommt man schließlich heraus
und
(Du kannst Dich ja mal dran versuchen)so das soll erstmal reichen. Der Latex-Prozessor funktioniert mal gerade wieder nicht - und ich sehe überall nur "Latex-Code"
(es kann also auch noch sein, dass da noch Fehler drin sind, weil ich die Formeln nicht sehen kann)
Wenn die Formeln bei Dir auch nicht da sind, musst Du auf zitieren drücken. Dann sieht man das Latex in Rohform.Aber sag' mir wenigstens welches Produkt Deine Firma herstellt und in welcher Branche sie tätig ist. Und wie kommst Du überhaupt zu diesem grausigen Benutzernamen?
Gruß
Werner
-
Werner Salomon schrieb:
Schandmaul schrieb:
nur mal so aus neugierde... heißt das es wäre, wenn bestimmt komplizierter, sogar möglich den drehpunkt irgendwie zu berechnen?
Ja klar - Du kannst alles berechnen, solange der Input ausreicht. Mit einem gegebenen Punkt (2 Freiheitsgrade in der Ebene) kannst Du eine Verschiebung (auch 2 Freiheitsgrade) oder eine Drehung und Skalierung bestimmen; je nach dem was man als gegeben annimmt. Mit 2 Punkten (4 Freiheitsgrade) kann man Verschiebung, Drehung und Skalierung bestimmen und mit 3 Punkten (6 Freiheitsgrade) oder mehr lässt sich Verschiebung, Drehung, Skalierung in x und y und die Scherung berechnen.
---8<---
--->8---
Gruß
WernerDa das System aber nichtlinear ist, sollte man Vorarbeiten erledigen.
1. Beide System auf ihre Schwerpunkte zentrieren
2. für Näherungs koordinaten Helmert Transformation ( cos(phi) sin(phi) werden durch a,b ersetzt dadurch erhöht sich die zahl der Unbekannten auf 4 wodurch keine Skalierung berechenbar ist -> x' = a*x+b*x+dx ; y' = -b*x +a*y + dy)die Schwerpunkt Zentrierung am Anfang ist zur Stabilisierung, b und a voneinander anhängig sind
-
hmm...
ich glaube ich bin damit jetzt erst mal 2-3 wochen beschäftigt,
vor allem um den latex code zu "entziffern" werd ich einige zeit brauchen...ich danke euch für die antworten und tips...
ich sag dann bescheid wenn ich entweder fertig, oder völlig verzweifelt bingruß
Schandi