AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Hilfe bei Schleifenerstellung für HexfeldGitter
Thema durchsuchen
Ansicht
Themen-Optionen

Hilfe bei Schleifenerstellung für HexfeldGitter

Ein Thema von Klausi1305 · begonnen am 7. Feb 2011 · letzter Beitrag vom 8. Feb 2011
Antwort Antwort
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, 20: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
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.477 Beiträge
 
Delphi 12 Athens
 
#2

AW: Hilfe bei Schleifenerstellung für HexfeldGitter

  Alt 8. Feb 2011, 09:20
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;

Geändert von Blup ( 8. Feb 2011 um 09:57 Uhr)
  Mit Zitat antworten Zitat
Klausi1305

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

AW: Hilfe bei Schleifenerstellung für HexfeldGitter

  Alt 8. Feb 2011, 21:59
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

BTWer 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;
Sebastian
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:14 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz