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;