Points rotieren
-
Hallo zusammen!
Ich habe hier ein kleines Problem bei dem ich nicht so ganz weiter komme.
Ich habe ein 2D-Achsensystem auf dem ein paar Messpunkte in Form einer
Kurve liegen. Jetzt möchte ich hier das interpolierte Maximum bestimmen. Dazu muss ich aber die Punkte zuvor um einen bestimmten Winkel rotieren.
Hat da jemand von euch schon etwas Erfahrung damit?
Find bei google nichts das für meinen Fall passen würde.Vielen Dank schonmal im voraus
-
-
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 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.
-
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 istDer 13.Punkt (2.25,8.9375) ist das gesuchte Maximumdies entspricht dem Punkt der Parabel, der die Steigung -0.5 hat (blaue Tangente in pumuckls Skizze)
Gruß
Werner