Einzelnen Beitrag anzeigen

oldmax

Registriert seit: 27. Apr 2006
Ort: Gieboldehausen
167 Beiträge
 
#8

Re: Windmühle, bei der die Flügelanzahl variabel ist

  Alt 29. Okt 2007, 13:13
Hi
Es ist relativ einfach, Windmühlenflügel zu programmieren. Überlegen wir, was notwendig ist:
Ein Mittelpunkt, dazu eignet sich ein TPoint. Dieser Variablentyp beinhaltet einen x und einen y Wert.
Z.B.
Nabe : TPoint (Global )
Delphi-Quellcode:
Nabe.x:=256; // Beispiel, so initialisierst du deinen Mittelpunkt im FormCreate
Nabe.y:=55;
Zwei weitere Variablen machen Sinn

Delphi-Quellcode:
Gradzahl : Real; (Global) // veränderbare Winkelvariable für die Bewegung
AnzFluegel : Integer; (Global) // falls eine veränderbare Flügelzahl erwünscht....
Um eine Linie zu zeichnen benötigen wir nun einen Anfangspunkt und einen Endpunkt.
Also, Anfang ist Mitte, Endpunkt ist Flügellänge und Winkel von Mitte. Daraus machen wir eine Funktion, in der wir diese Werte als Parameter übergeben und einen TPoint-Wert erhalten:
Delphi-Quellcode:
Function TMyForm.Endpunkt( Radius: Integer; Winkel: Real; Zentrum : TPoint):TPoint;
Var xypunkt : TPoint;
Begin
   xypunkt.x:=Trunc(Cos(DegToRad(Winkel))*(-Radius))+Zentrum.x;
   xypunkt.Y:=Trunc(Sin(DegToRad(Winkel))*(-Radius))+Zentrum.Y;
   Result:= xypunkt;
End;
Nun die Zeichnung der Linie, am besten eine Procedur mit den Parametern Anfangspunk, Endpunkt und Farbe. Die Farbe brauchst du, um die alte Zeichnung wieder zu löschen. Nehmen wir an, du zeichnest auf einem grünen Untergrund. Eine Rote Linie ist sichtbar, eine grüne nicht...
Also
Delphi-Quellcode:
Procedure TMyForm.ShowFluegel(Anfang,Ende: Tpoint; Farbe : TColor);
Begin
   MyForm.Canvas.Pen:Color:=Farbe;
   MyForm.Canvas.Moveto(Anfang.x, Anfang.Y);
   MyForm.Canvas.Lineto(Ende.x, Ende.Y);
End;
Eigentlich lassen sich jetzt schon die Programmzeilen testen, wenn ich z.B. über ein Button erst mal einen Endpunkt errechne und dann anschließend die Anzeige aufrufe. Du willst aber die Flügellänge und die Anzahl der Flügel selbst bestimmen. Nun gut, 2 Editfelder mit den Werten und nun geht es los.

In die Ereignisroutine deines Tasters setzt du erst mal folgenden Code:

Delphi-Quellcode:
Procedure TMyForm.MyButtonClick(Sender:Tobject);
Var i : Integer;
      Sektorwinkel : Real;
      Kreispunkt : Tpoint;
Begin
    AnzFluegel :=StrToInt(Ed_Fluegel.Text); //Editfeld mit Namen ED_Fluegel // globale Variable setzen
    For i:=1 to AnzFluegel do // jeden einzelnen Flügel berechnen und darstellen
    Begin
        SektorWinkel:=360/Anzfluegel *i; // Winkel der einzelnen Flügel berechnen
        Sektorwinkel:=Sektorwinkel+GradZahl; // Irgendwann soll sich das Windrad ja drehen
        If SektorWinkel > 360 then Sektorwinkel:=Sektorwinkel-360; // wir bleiben bei 360 ° Kreis
        Kreispunkt :=EndPunkt(StrToInt(Ed_Fluegellaenge.Text),Sektorwinkel,Nabe); // separater Aufruf schafft Durchblick
        ShowFluegel(Nabe, Kreispunkt, ClGreen); // erst mal unsichtbar......
    End; // I-Schleife
    Gradzahl:=Gradzahl+1; // Gradzahl erhöhen, >1 wird die Drehung schneller
    If GradZahl>360 then GradZahl:=1; // auf 360° begrenzen
    For i:=1 to AnzFluegel do // und jeden einzelnen Flügel berechnen und darstellen
    Begin
        SektorWinkel:=360/Anzfluegel *i; // Winkel der einzelnen Flügel berechnen
        Sektorwinkel:=Sektorwinkel+GradZahl; // Irgendwann soll sich das Windrad ja drehen
        If SektorWinkel > 360 then Sektorwinkel:=Sektorwinkel-360; // wir bleiben bei 360 ° Kreis
        Kreispunkt :=EndPunkt(StrToInt(Ed_Fluegellaenge.Text),Sektorwinkel,Nabe);
       ShowFluegel(Nabe, Kreispunkt, ClRed); // jetzt sichtbar......
    End; // I-Schleife

End;
Nun kannst du mit Tastendrücken schrittweise prüfen, ob alles klappt. Ist es nach deinem Geschmack geraten, kannst du an die Automatisierung gehen. Nimm einen Timer und kopiere dein Button-Ereignisprogramm mit den Variablen hinein. Die Zuweisung der AnzFluegel-Variable löschst du im Timer Ereignis und im Button-Ereignis löscht du alles außer der Zuweisung der AnzFluegel-Variable.
Feddisch........

Noch mal eine kurze Bemerkung zu fogenden Zeilen

Delphi-Quellcode:
Kreispunkt :=EndPunkt(StrToInt(Ed_Fluegellaenge.Text),Sektorwinkel,Nabe); // separater Aufruf schafft Durchblick
ShowFluegel(Nabe, Kreispunkt, ClGreen); // erst mal unsichtbar......
Das geht auch ....
ShowFluegel(Nabe, EndPunkt(StrToInt(Ed_Fluegellaenge.Text), Sektorwinkel, Nabe), ClGreen); Kreispunkt wird mit dem Funktionsaufruf ersetzt und erspart die Variable „Kreispunkt“
Ist aber schlecht zu Kommentieren und für Anfänger nicht
Gruß oldmax
Noch ist mein Rechner mir zu Diensten.... ansonsten habe ich die Macht ihn zu vernichten !
  Mit Zitat antworten Zitat