Rotationswinkel einer Linie heraus finden? (Pfeil zeichnen)
-
Habe ein Problem: ich habe eine "Zeichenfunktion" in unserer Applikation für den User eingebaut, mit der er in einer Konstruktionszeichnung (einfache Bitmap) Markierungen machen können soll. Also er zieht eine Linie die auf eine Stelle in der Bitmap zeigt, und kann dann einen Bemerkungstext ans Ende der Linie schreiben. Soweit bin ich schon gekommen.
Nun soll aber an die Linie vorne auch ein kleiner Pfeil dran (ein einfaches Dreieck). OK, ein Dreieck kann ich auch noch zeichnen.
Meine Frage: wie finde ich bei einer Pixellinie (habe x1, y1, x2, y2) heraus, welchen Rotations-Winkel sie hat? Denn der User kann ja die Linie frei zeichnen. Und das Dreieck soll ja passend an das eine Ende rangepappt werden.
Das rotieren des Dreiecks kann ich selbst machen, wenn ich den Winkel der Linie kenne - letzteres fehlt mir aber. Wer weiß rat?
-
tan(alpha) = (y2 - y1) / (x2 - x1)
-
Wende darauf aber bitte nicht den Arcustangens an! Da muss man unterscheiden, ob x2-x1 <0 oder >0. Im zweiten Fall kannst du das so machen, aber im erstn musst du noch ein PI draufaddieren auf den Arcustangens.
Außerdem ist noch zu spezifizieren, was hier der Rotationswinkel sein soll. Wenn es so wie in der folgenden Zeichnung sein soll, dann liegt Krösus falsch.(x2,y2) / / /__ /_a_|____ (x1,y1)
Hier soll a für alpha stehen, und die Linie / die Gerade darstellen. Wenn dieser Winkel gemeint wäre, dann ist
.
-
OK, Anleitung (mit (x1,y1) als Angelpunkt):
double GetRotAngle(int x1, int y1, int x2, int y2) { if(y2 < y1) { if(x1 < x2) return( arctan( (y1 - y2) / (x2 - x1) ) ); else if(x1 > x2) return( PI + arctan( (y1 - y2) / (x2 - x1) ) ) else if(x1 == x2) return( PI / 2 ); } else if(y2 > y1) { if(x1 < x2) return( arctan( (y1 - y2) / (x2 - x1) ) ); // Addiere noch 2*PI drauf, // wenn du keinen negativen Winkel willst else if(x1 > x2) return( PI + arctan( (y1 - y2) / (x2 - x1) ) ); else if(x1 == x2) return( (double)3/(double)2 * PI ); } else if(y2 == y1) { if(x2 > x1) return( 0 ); else if(x2 < x1) return( PI ); else if(x2 == x1) return( 0 ); } }
Für den Pfeil kannste dir ja ein Bitmap machen, so wie z.B.
|\ | \ | / |/
Dieses muss natürlich nach rechts zeigen. Jetzt kannst du den Rotationswinkel mit obiger Funktion bestimmen und das Bitmap mit den Windows GDI-Funktionen drehen (gesetzt den Fall, du programmierst für Windose).
-
Vielen dank für die Antworten!
WebFritzi! Ich werde deinen Code gleich mal ausprobieren, so das ich ihn morgen auf Arbeit einsetzen kann. Eine Bitmap für den Pfeil zu nutzen habe ich auch in Betracht gezogen. Auf Arbeit code ich jedoch in Java und da gibts eine Transformations-Klasse, mit der man Objekte drehen kann. Weiß aber nicht ob man sie für Bitmaps oder geometrische Objekte nutzen kann. Spätestens morgen werde ich es heraus finden. Habe unter Java noch nicht viel mit Grafik gemacht.
Auf jeden Fall herzlichen Dank!