Points rotieren



  • Das gilt aber so wie ich das sehe alles nur für eine punnktemenge die auf EINER Kreisbahn liegen. Bei mir sind das aber Punkte die nicht auf einer Kreisbahn liegen.



  • Wenn du einen Punkt "rotierst", bewegt er sich auf einer Kreisbahn um die Rotationsachse 😉 Aber eventuell erklärst du mal genauer, welche Beziehung zwischen der gegebenen Kurve und der Punktbewegung - und deinem Endziel - besteht.



  • kann nicht so recht nachvollziehen, wozu du da eine rotation benötigst. interpolationsintervalle sind doch stetige funktionen, da kommst mit "simpler" analysis zum ziel.



  • Also das Problem ist Folgendes.

    Stell dir einfach mal den Graphen einer nach unten geöffneten Kurve vor.
    Jetzt dreh das ganze einfach um ein paar Grad nach rechts oder links.
    Jetzt steht der Hochpunkt der Kurve ja schief und ich kann ihn nicht berechnen.
    Das ist in Prinzip das was ich habe. Ich hab ein paar Messpunkte und möchte da das Maximum bestimmen, muss dafür die Punkte aber erst verdrehen damit ich das Maximum bestimmen kann.
    Ist recht schwer zu erklären.



  • und schwer nachzuvollziehen ^^ klingt so, als lägen deine messwerte in "falschen" koordinaten vor und du wolltest sie deshalb in ein anderes koordinatensystem rotieren. dafür ist die schon genannte rotation geeignet.



  • Na dann drehe sie doch - das ist eine ganz normale 2D Rotation (dir sollte nur klar sein, daß deine Kurve dabei auch ihre Lage ändern wird - d.h. die rotierten Punkte liegen größtenteils nicht auf der Originalkurve, sondern auf einer rotierten Kurve).

    PS: Von was für Messpunkten reden wir hier eigentlich? Und woher kommt dabei die Verdrehung?



  • Weiß auch nicht so recht um welche Messgrößen es sich handelt. Spielt aber auch für mich keine Rolle. Das ist schwer zu erklären. Ich denke, ich werd das wohl allein lösen müssen. Danke erstmal für die Mühe.



  • Gast12345 schrieb:

    Weiß auch nicht so recht um welche Messgrößen es sich handelt. Spielt aber auch für mich keine Rolle.

    Wenn noch nicht einmal du weißt, was da gemessen werden soll, woher sollen wir es dann wissen?



  • Eine andere Möglichkeit wäre, über die Analysis zu gehn:
    Das Maximum deiner Kurve liegt da, wo ihre Ableitung 0 ist. Wenn die Kurve um einen bestimmten Winkel rotiert ist, bedeutet dass, dass die Ableitung an der Stelle des wirklichen Maximums nichtmehr 0 ist sondern der Steigung einer Geraden entspricht, die ebenfalls um diesen Winkel rotiert ist. Wenn deine Kurve um den Winkel φ im Uhrzeigersinn rotiert wurde bedeutet das, dass die Ableitung a an der Stelle des echten Maximums dann den Wert a=−tanφa = -\tan\varphi haben muss. Da es sich bei dir wahrscheinlich um diskrete Punkte handelt müsstest du also deine Punkte einzeln durchgehn und mit dem jeweils nächsten den Differenzenquotienten zu bilden als Ableitung. Da wo dieser Differenzenquotient zwischen einem Wert kleiner als a und einem Wert größer als a wechselt, liegt dein gesuchtes echtes Maximum. Ich versuch gleich mal ne Zeichnung zusammenzufrickeln.

    edit:
    http://www.derpumu.de/jpg/Maximumgekippt.jpg



  • Ah das ist eine sehr gute Idee.
    Vielen Dank für die Hilfe



  • Der Vorschlag von pumuckl ist gut. Eine weitere Möglichkeit besteht darin, die Punkte als Zahlen in der Komplexen Zahlenebene aufzufassen und die Rotation als Multiplikation mit einer weiteren komplexen Zahl. Vorteil ist, dass C++ bereits alles dazu notwendige bereithält.

    Das sähe etwa so aus:

    #include <algorithm>    // max_element
    #include <complex>      // complex
    #include <iostream>     // cout, endl
    #include <vector>       // vector
    
    struct KleinerInRichtung
    {   
        KleinerInRichtung( const std::complex< double >& n ) : m_cn( conj( n ) ) {} // neg. Drehung -> conj
        bool operator()( const std::complex< double >& a,  const std::complex< double >& b ) const
        {
            // nach Rotation um m_cn Realteile vergleichen
            return real( a * m_cn ) < real( b * m_cn );
        }
    private:
        std::complex< double > m_cn;
    };
    
    int main()
    {
        using namespace std;
        vector< complex< double > > messungen;
        for( double x = -1.0; x < 5.0; x += 0.25 ) // Messwerte füllen
            messungen.push_back( complex< double >( x, x*(4 - x) + 5 ) ); // Parabel -x^2+4x+5
    
        vector< complex< double > >::iterator i = max_element( messungen.begin(), messungen.end(),
            KleinerInRichtung( complex< double >( 1, 2 ) ) );
        cout << "Der " << distance( messungen.begin(), i ) << ".Punkt " << *i << " ist das gesuchte Maximum" << endl;
        return 0;
    }
    

    Der Vektor (1,2) gibt hier die Richtung an, in der das Maximum gesucht wird. Dies entspricht der grauen Linie in pumuckls Skizze.
    Das Ergebnis ist

    Der 13.Punkt (2.25,8.9375) ist das gesuchte Maximum
    

    dies entspricht dem Punkt der Parabel, der die Steigung -0.5 hat (blaue Tangente in pumuckls Skizze)

    Gruß
    Werner


Anmelden zum Antworten