Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
FreePascal / Lazarus
|
AW: Kompass 2D
19. Jan 2015, 22:15
Wie zeichnest du denn?
Ich würde empfehlen, mit Vektoren zu arbeiten und Winkel, wo es nur geht, komplett zu vermeiden. In Programmen mit Winkeln zu arbeiten ist immer sehr umständlich und außerdem langsam. Dazu kommen noch Probleme wie 360° = 0°. Meine wärmste Empfehlung: Lerne Vektorrechnung (Analytische Geometrie)! Kommt leider in der Schule viel zu kurz bzw. erst ziemlich spät. Aber mein Leben ist dadurch so viel einfacher geworden...
Um mal am Kompass-Beispiel zu zeigen: Ich nehme mal an, um den Zeiger zu zeichnen hast du irgendwo sowas stehen wie LineTo(Mitte.X + cos(Winkel)*Nadellänge, Mitte.Y + sin(Winkel*Nadellänge)
. Das ist im Grunde von hinten durch die Brust ins Auge, weil du wahrscheinlich erst aus einem Vektor den Winkel gemacht hast, nur um dann den Winkel mit sin/cos wieder in einen Vektor zurückzuverwandeln.
Dabei braucht man den Winkel gar nicht. Sagen wir dein (2D-)Vektor heißt V und der zugehörige Winkel φ. Es gilt (immer): V.X = cos(φ) * Vektorlänge und V.Y = sin(φ) * Vektorlänge. Wenn du jetzt einen Vektor mit der Länge 1 haben willst, der in die gleiche Richtung zeigt, dann kannst du das ganz einfach, indem du die V.X und V.Y jeweils durch die Vektorlänge (Pythagoras: Länge = Sqrt(V.X² + V.Y²)) dividierst. Was kommt nun dabei raus? Klar: Ein neuer Vektor V’ mit V’.X = cos(φ) und V’.Y = sin(φ) (den Schritt nennt man übrigens auch normalisieren, und das Ergebnis ist ein sogenannter Einheitsvektor). Ja, und damit ist es jetzt ganz einfach, die Kompassnadel zu zeichnen: LineTo(Mitte.X + V’.X*Nadellänge, Mitte.Y + V’.Y*Nadellänge
. Und wir haben kein einziges mal Sinus, Cosinus oder Arctan gebraucht. Deine ganze GetWinkel-Funktion wird überflüssig.
Jetzt gibt es natürlich noch ein kleines Problem: Der Vektor von deinem Sensor hat 3 Dimensionen. Du kannst aber leicht deinen gewünschten 2D-Vektor daraus berechnen, indem du eine der Komponenten X, Y oder Z einfach weglässt. Das hat Medium schon beschrieben.
|