Autor Beitrag
Alex_ITA01
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 56

Win XP
D7 Prof
BeitragVerfasst: Mi 15.09.04 09:03 
Hallo erstmal...
ich wollte mal fragen, ob irgendjemand ne coole Idee hat, eine grafische Anzeige der Windrichtung darzustellen (z.B. eine Windrose)?!
Ich habe in einer Variablen die aktuelle Gradzahl (z.B. 0° entspricht Süden...)
Könnte mir da jemand helfen?
Danke schonmal im voraus
.Chef
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1112



BeitragVerfasst: Mi 15.09.04 10:13 
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.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var
  r1 : Integer; //Radius Spitze
  r2 : Integer; //Radius Knick
  p : array[0..8of 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:
ausblenden 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

_________________
Die Antworten auf die 5 häufigsten Fragen:
1. Copy(), Pos(), Length() --- 2. DoubleBuffered:=True; --- 3. Application.ProcessMessages bzw. TThread --- 4. ShellExecute() --- 5. Keine Vergleiche von Real-Typen mit "="!
Alex_ITA01 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 56

Win XP
D7 Prof
BeitragVerfasst: Mi 15.09.04 10:21 
jo danke das sieht schonmal sehr gut aus.ich werde noch einiges da reinbauen müssen (also pfeil und sowas)
danke nochmal
Alex
Alex_ITA01 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 56

Win XP
D7 Prof
BeitragVerfasst: Mi 15.09.04 10:42 
nochmal ne frage:
bekomme ich auch irgendwie hin, das ich noch eine "kleine" windrose in die ecken der großen zeichne? also im prinzip das ich zwei Stück habe die um 45° versetzt sind?!
Danke
Alex
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 15.09.04 13:26 
Ich will ja nichts sagen, aber in der DP hat er mittlerweile ein komplettes Demo Projekt bekommen. Da es wieder mal ein Crossposting war ohne das die Postings verlinkt wurden.... :evil:
.Chef
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1112



BeitragVerfasst: Mi 15.09.04 13:55 
Alex_ITA01 hat folgendes geschrieben:
nochmal ne frage:
bekomme ich auch irgendwie hin, das ich noch eine "kleine" windrose in die ecken der großen zeichne? also im prinzip das ich zwei Stück habe die um 45° versetzt sind?!

Selbes Prinzip, wie du schon sagtest "um 45 Grad versetzt". Nimm kleinere Radien, und zeichne die versetzte Windrose zuerst, damit sie unter den Hauptrichtungen liegt.

_________________
Die Antworten auf die 5 häufigsten Fragen:
1. Copy(), Pos(), Length() --- 2. DoubleBuffered:=True; --- 3. Application.ProcessMessages bzw. TThread --- 4. ShellExecute() --- 5. Keine Vergleiche von Real-Typen mit "="!