Also ich geh jetzt mal von folgenden Annahmen aus, die zwingend notwendig sind, damit wir nicht aneinander vorbeireden:
- 0 Grad ist Osten (mathematisch so üblich, kannst du später ändern)
- horizontal liegt die x-Achse, positives Ende im Osten
- vertikal liegt die y-Achse, positives Ende im Süden (wegen Canvas)
Ich erklär jetzt am Beispiel der Hauptrichtungen, wie du die Windrose zeichnest. Du brauchst dann für die Nebenrichtungen nur genauso vorzugehen, nur mit anderen Winkeln und Radien.
Also: Du hast zwei Radien, den inneren (Knick) und den äußeren (Spitze). Mit Hilfe von Sinus und Cosinus berechnest du die x und y Werte, die du dann nur noch mit PolyLine zeichnen musst.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| var r1 : Integer; r2 : Integer; p : array[0..8] of TPoint; a : Integer; begin r1:=50; r2:=10; p[0].x:=Round(sin(0*pi/180)*r1); p[0].y:=Round(cos(0*pi/180)*r1); |
Hier wird der erste Punkt berechnet (Ostspitze). Das pi/180 könntest du in dem Fall weglassen. Es soll nur verdeutlichen, dass du Grad in Radiant umrechnen musst. So musst du nun mit jedem Punkt verfahren, sinnigerweise in einer Schleife. Zu jedem Wert wird dann nochmal r1 addiert, damit die Windrose auch vollständig zu sehen ist:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| for a:=0 to 3 do begin p[a*2].x:=Round(sin(a*pi/2)*r1)+r1; p[a*2].y:=Round(cos(a*pi/2)*r1)+r1; end; for a:=0 to 3 do begin p[a*2+1].x:=Round(sin((a*90+45)*pi/180)*r2)+r1; p[a*2+1].y:=Round(cos((a*90+45)*pi/180)*r2)+r1; end; p[8]:=p[0]; Image1.Canvas.PolyLine(p); |
Routine ist ungetestet, kann also Schönheitsfehler enthalten.
Wenn du dann deine Windrose (mit Haupt- und Nebenrichtungen gezeichnet hast, kannst du nach dem selben Prinzip einen Pfeil darüberzeichnen, der die aktuelle Richtung angibt.
Gruß,
Jörg