Einzelnen Beitrag anzeigen

Klausi1305

Registriert seit: 20. Jan 2011
Ort: Leipzig
15 Beiträge
 
Turbo Delphi für Win32
 
#1

Hilfe bei Schleifenerstellung für HexfeldGitter

  Alt 7. Feb 2011, 19:04
Delphi-Version: 2006
Hallo Gemeinde...

Ich hänge seit geraumer Zeit an einer Schleife, die mir ein Hexfeldgitter auf ein TImage zaubert.

Ich habe dazu eine Procedure HexFeldDraw, welche mir ein Hexfeld erzeugt, sowie eine Procedure HexGritterDraw worin in Abhängigkeit von der Größe des Images und der Kantenlänge des Hexfeldes die Hexfelder komplett ausfüllend ins Image gezeichnet werden sollen.

Jedoch komme ich nur bis zur 1. Spalte...Alle weiteren kann ich nur erzeugen, wenn ich immer pro Spalte eine neue Schleife laufen lasse. Jedoch weiss ich ja nie, wieviele Spalten es werden könnten??

Weiss jemand einen Rat?

Delphi-Quellcode:
Procedure TForm2.HexFeldDraw(Var MitteX,MitteY,Kantenlänge : Integer);
Var
    Höhe2: Integer; //Halbe Hexagon Höhe
    HöheHex : Integer; //Gesamt Hexagon Höhe
Begin
{1 Hexagon zeichen}
{    2.  3.
    1. MXY  4.
      6.  5.            }

Höhe2:= Round(SQRT((Kantenlänge*Kantenlänge)-((1/2)*(Kantenlänge*Kantenlänge))));
HöheHex:=Höhe2*2;
Label4.Caption:=IntToStr(HöheHex);//GesamtHöhe wird ausgegeben
//Zu 1. Ecke bewegen
Image1.Canvas.MoveTo(MitteX-Kantenlänge,MitteY);
//Linie zur 2.Ecke zeichnen
Image1.Canvas.LineTo(MitteX-Round(Kantenlänge/2),MitteY-Round(Höhe2));
//Linie zur 3. Ecke zeichnen
Image1.Canvas.LineTo(MitteX+Round(Kantenlänge/2),MitteY-Round(Höhe2));
//Linie zur 4. Ecke zeichnen
Image1.Canvas.LineTo(MitteX+Round(Kantenlänge),MitteY);
//Linie zur 5. Ecke zeichnen
Image1.Canvas.LineTo(MitteX+Round(Kantenlänge/2),MitteY+Round(Höhe2);
//Linie zur 6. Ecke zeichnen
Image1.Canvas.LineTo(MitteX-Round(Kantenlänge/2),MitteY+Round((Höhe2)));
//Linie zur 1. Ecke zeichnen
Image1.Canvas.LineTo(MitteX-Kantenlänge,MitteY);
end;
Delphi-Quellcode:
procedure TForm2.HexGitterDraw;
Var
   X,Y : Integer;
   Zähler : Integer; //Zählvariable für Schleifen
   HöheImage: Integer;//Image1 Höhe
   Breiteimage: Integer;//Image1 Breite
   AnzahlHexinHöhe: Integer; //Anzahl der HexFelder in einer Spalte
   AnzahlHexinBreite: Integer;//Anzahl der HexFelder in einer Reihe
   Kantenlänge: Integer;//Kantenlänge einer Seite des Hexagons
   Höhe2: Integer; //Halbe Hexagon Höhe
   HöheHex : Integer; //Gesamt Hexagon Höhe
   StartX : Integer; //X Koordinate der Mitte des oberen linken HexFeldes
   StartY : Integer; //Y Koordinate der Mitte des oberen linken HexFeldes
Begin
     HöheImage:=Image1.Height; //ImageHöhe bestimmen
     BreiteImage:=Image1.Width; //ImageBreite bestimmen
     Kantenlänge:=StrToInt(Edit3.Text);//Einlesen der Kantenlänge des Hexagons
     Höhe2:= Round(SQRT((Kantenlänge*Kantenlänge)-((1/2)*(Kantenlänge*Kantenlänge))));
     HöheHex:=Höhe2*2; //Gesamthöhe des Hexfeld in Pixel
     AnzahlHexinHöhe:=round(HöheImage/HöheHex);//Anzahl der HexFelder in einer Spalte bestimmen
     AnzahlHexinBreite:=round(BreiteImage/(2*Kantenlänge));//Anzahl der HexFelder in einer Reihe bestimmen
     Label6.Caption:=IntToStr(AnzahlHexinHöhe);
     Label7.Caption:=IntToStr(AnzahlHexinBreite);
     //Mitte des oberen linken HexFeldes Bestimmen
     StartX:=Kantenlänge;
     StartY:=Höhe2;

{Ungerade Spaltenzahlen haben die obere Kante des obersten Hexfeldes
am oberen Rand des Images,
Geraden Spaltenzahlen haben die obere Kante auf Y Wert des Mittelpunktes
eines Hexfeldes aus einer ungeraden Spalte}


//----------------1.Spalte zeichnen---------------
     Zähler:=0; //Zähler für Schleife zum zeichnen 1. Spalte
     Y:=StartY; //Übergabe der Variable zum weiteren verarbeiten
     Repeat
        Inc(Zähler);
        HexFeldDraw(StartX,Y,Kantenlänge);
        Y:=Y+HöheHex;
    Until Zähler=AnzahlHexinHöhe;
End;
Sebastian
  Mit Zitat antworten Zitat