rotation und verschiebung von koordinaten ermitteln



  • Werner Salomon schrieb:

    Besser ist es, den sin und cos dieses Winkels zu bestimmen und dann die Funktion atan2 zu nutzen. Das Skalarprodukt ist
    ab=abcosϕ\vec{a} \cdot \vec{b}=\left| \vec{a} \right| \cdot \left| \vec{b} \right| \cdot \cos{\phi}

    und das Kreuzprodukt ist
    a×b=absinϕ\vec{a} \times \vec{b}=\left| \vec{a} \right| \cdot \left| \vec{b} \right| \cdot \sin{\phi}

    damit kann man phi bestimmen aus
    ϕ=atan2(Dp1×Dp2,Dp1Dp2)\phi = atan2 \left( \vec{Dp1} \times \vec{Dp2} , \vec{Dp1} \cdot \vec{Dp2} \right)

    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 ausplaudern 😉

    sicher 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 ausplaudern 😉

    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?



  • 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
    p=pd\vec p'=\vec p - \vec d
    und
    q=qd\vec q'=\vec q - \vec d
    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
    n=p¯qp2n = \frac{{\sum {\bar pq} }}{{\sum {\left| p \right|^2 } }}
    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=(0T_11p_i0qi)2S = \sum {\left( {{}^0T\_1 {}^1\vec p\_i - {}^0\vec q_i } \right)^2 }
    S ist hier die Summe aller Längenquadrate. Der Drehwinkel steckt in dem 0_T_1 drin. Ausgeschrieben ist das

    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 }

    mit

    nx=cos(φ)ny=sin(φ)n_x = \cos \left( \varphi \right) n_y = \sin \left( \varphi \right)

    wenn man das jetzt aus multipliziert und nach n_x und n_y ableitet, so bekommt man schließlich heraus
    nx=pqp2n_x = \frac{{\sum {\vec p\vec q} }}{{\sum {\vec p^2 } }}
    und
    ny=p×qp2n_y = \frac{{\sum {\vec p \times \vec q} }}{{\sum {\vec p^2 } }}
    (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ß
    Werner

    Da 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 bin 😉

    gruß
    Schandi


Anmelden zum Antworten