![]() |
Delphi-Version: 2006
Hilfe bei Schleifenerstellung für HexfeldGitter
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; |
AW: Hilfe bei Schleifenerstellung für HexfeldGitter
Code:
x0 x1 x2 x3
y0 __________ / \ / \ y1 / \ \ / \ / y2 \__________/ Anzahl Spalten dx1 = x1 - x0 = x3 - x2 dx2 = x2 - x1 nx = (Breite - dx1) div (dx1 + dx2) Anzahl Zeilen dy = y1 - y0 = y2 - y1 ny = (Höhe - dy) div dy Als Bezugspunkt würde ich nicht die Mitte, sondern die linke obere Ecke des Rechtecks wählen, in dem das Hexagon gezeichnet wird (x0, y0). Edit: Die Zeilen sind eigentlich Halbzeilen.
Delphi-Quellcode:
for y := 0 to ny - 1 do
begin y0 := y * dy; if Odd(y) then begin x0 := dx1 + dx2; n := nx div 2; end else begin x0 := 0; n := (nx + 1) div 2; end; for x := 0 to n - 1 do begin HexFeldDraw(x0, y0, dx1, dx2, dy); x0 := x0 + dx1 + dx2 + dx1 + dx2; end; end; |
AW: Hilfe bei Schleifenerstellung für HexfeldGitter
Danke für die Hilfe Blup...
Der entscheidende Hinweis war aber die FOR Schleife...Diese Möglichkeit hatte ich komplett ausgeblendet. Die Erstellung des Grids funktioniert jetzt..Hier mal der Quellcode BTW:Der einzigste Fehler bis jetzt ist die Durchnummerierung des Arrays Feld
Delphi-Quellcode:
procedure TForm2.HexGitterDraw;
Var Feld : array of TFeld;//Array zum Speichern der Feld Infos Y,I,Z : 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 VersetzungUngerade: Integer;//Versetzungsfaktor für ungerade Spalten relativ zum StartPunkt AnzahlHexGesamt: Integer;//Gesamtanzahl der Hex 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/(Kantenlänge)/3);//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; AnzahlHexGesamt:=AnzahlHexinHöhe*AnzahlHexinBreite; VersetzungUngerade:=3*Kantenlänge; //----------------ungerade Spalten zeichnen--------------- For I:=0 to AnzahlHexinBreite-1 do Begin Setlength(Feld,AnzahlHexGesamt); Zähler:=0; //Zähler für Schleife zum zeichnen 1. Spalte Z:=-1; //Zähler für Arrayfüllung Y:=StartY; //Übergabe der Variable zum weiteren verarbeiten Repeat Inc(Zähler); Inc(Z); HexFeldDraw(StartX,Y,Kantenlänge); Feld[Z].ID:=Zähler; Feld[Z].MX:=StartX; Feld[Z].MY:=Y; Y:=Y+HöheHex; Until Zähler=AnzahlHexinHöhe; StartX:=StartX+VersetzungUngerade; end; //----------------Gerade Spalten zeichnen--------------- StartX:=Round(5/2*Kantenlänge); StartY:=HöheHex; For I:=0 to AnzahlHexinBreite-1 do Begin Zähler:=0; //Zähler für Schleife zum zeichnen Spalte Y:=StartY; //Übergabe der Variable zum weiteren verarbeiten Repeat Inc(Zähler); Inc(Z); HexFeldDraw(StartX,Y,Kantenlänge); Feld[Z].ID:=Zähler; Feld[Z].MX:=StartX; Feld[Z].MY:=Y; Y:=Y+HöheHex; Until Zähler=AnzahlHexinHöhe-1; StartX:=StartX+VersetzungUngerade; end; //--------------Ausgabe der Arraywerte in Memo1------------ Memo1.Clear; For Z:=0 to AnzahlHexGesamt do Memo1.Lines.Add(IntToStr(Feld[Z].ID)+' '+IntToStr(Feld[Z].MX)+' '+IntToStr(Feld[Z].MY)); End; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz