Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Algorithmus gesucht: Abstand von zwei Hexagons (https://www.delphipraxis.net/118873-algorithmus-gesucht-abstand-von-zwei-hexagons.html)

Codewalker 16. Aug 2008 22:24


Algorithmus gesucht: Abstand von zwei Hexagons
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen.

Ich grübele seit Tagen über einem Problem und habe das Gefühl, ich sehe den Wald vor lauter Bäumen nicht. Ich suche eine Möglichkeit, in einem Spielfeld mit sechseckigen Spielfeldern (á lá Siedler von Catan) den Abstand zwischen zwei beliebigen Hexagons zu bestimmen (in Feldern, nicht in Pixeln).

Im angehangenen Screenshot sieht man (zwar klein, aber zu sehen) die Nummerierung der Felder (also X und Y-Koordinaten). Ich würde gerne nur aus den Nummern zweier Felder den Abstand zwischen diesen beiden Feldern bestimmen (in Feldern).

Beispiel: Wieviel Felder muss ich "laufen" um von 0,0 zu 13,17 zu kommen?

Bin für jede Idee/Code/etc. dankbar.

(Benötige ich für die Programmierung der Wegfindung - schon irgendwie merkwürdig :mrgreen: )

Grüße

omata 16. Aug 2008 22:26

Re: Algorithmus gesucht: Abstand von zwei Hexagons
 
Screenshot?

Codewalker 16. Aug 2008 22:31

Re: Algorithmus gesucht: Abstand von zwei Hexagons
 
Möhp, ich wollte extra dran denken. Ist wohl schon zu spät am Abend :wink:
Danke für den Hinweis

omata 16. Aug 2008 23:23

Re: Algorithmus gesucht: Abstand von zwei Hexagons
 
Vielleicht so...
Delphi-Quellcode:
function Schritte(X1, Y1, X2, Y2:integer):integer;
var X, Y:integer;
begin
  if (X1 <= 0) or (X2 <= 0) or (Y1 <= 0) or (Y2 <= 0) then
    raise Exception.Create('Die Werte müssen alle größer Null sein.');
  X:=abs(X1 - X2);
  Y:=abs(Y1 - Y2);
  if X = 0 then
    Result:=Y
  else if Y = 0 then
    Result:=X
  else begin
    if (X > 1) and (Y > 1) then
      dec(X);
    Result:=X + Y;
  end;
end;

Codewalker 17. Aug 2008 09:01

Re: Algorithmus gesucht: Abstand von zwei Hexagons
 
Hi Omata. Das sieht schon sehr gut aus :thumb: . Da ich die Felder beginnend mit 0 nummeriere musste ich noch jeweils +1 auf die Feldbezeichnung addieren.
Wenn ich jetzt aber vom Feld (0,2) auf das Feld (6,1) gehen will, liefert deine Funktion 7 - richtig wäre aber 6 Felder.
Ist suche schon danach, aber vielleicht hast du eine Idee, woran es liegt.

cmrudolph 17. Aug 2008 09:25

Re: Algorithmus gesucht: Abstand von zwei Hexagons
 
Wenn mir kein Fehler unterlaufen ist, dann funktioniert dieser Quellcode:

Delphi-Quellcode:
function Schritte(X1, Y1, X2, Y2:Integer): Integer;
var
  X,Y: Integer;
begin
  if (X1 < 0) or (X2 < 0) or (Y1 < 0) or (Y2 < 0) then
    raise Exception.Create('Die Werte müssen alle größer oder gleich Null sein.');

  X:=abs(X1 - X2);
  Y:=abs(Y1 - Y2);
 
  Result:=X;
 
  if (Y*2 > X) then begin
    inc(X,X mod 2);
    dec(Y,X div 2);
    inc(Result,Y);
  end;
end;
Edit: an Index beginnend bei 0 angepasst
Edit 2: Exit entfernt
Edit 3: Code funktioniert noch nicht 100%ig - Beispiel: 2-2 9-6
Edit 4: Fix

Codewalker 17. Aug 2008 09:31

Re: Algorithmus gesucht: Abstand von zwei Hexagons
 
Leider auch nur fast. Wenn du als Ausgangspunkt z.B. 0,0 nimmst und nach 0,11 gehst - dann muss man 12 Felder laufen, die Funktion liefert aber nur 11. Evtl. muss man ja Unterscheiden, ob man von einer geraden in eine ungerade Reihe wechselt. Ich versuch das mal...

Edit: Ich habe am Ende noch folgendes eingefügt:

Delphi-Quellcode:
  if Odd(X1) <> Odd(X2) then
   Inc(Result,1);
Damit ist es bisher korrekt, außer bei zwei direkt benachbarten Feldern. Da kommt dann 2 statt 1 raus - aber das ist auch noch zu machen ;-)

Codewalker 17. Aug 2008 09:37

Re: Algorithmus gesucht: Abstand von zwei Hexagons
 
So funktioniert es (auch mit 2-2 9-6 ;-) ). Wenn von Euch kein Veto mehr kommt (meine Test klappen alle) würde ich den doch glatt für die CodeLib vorschlagen (daher neuer Beitrag). Danke an Euch beide für Mühe und Zeit, ihr seid spitze :thumb:

Delphi-Quellcode:
function Schritte(X1, Y1, X2, Y2:Integer): Integer;
var
  X,Y: Integer;
begin
  if (X1 < 0) or (X2 < 0) or (Y1 < 0) or (Y2 < 0) then
    raise Exception.Create('Die Werte müssen alle größer oder gleich Null sein.');

  X:=abs(X1 - X2);
  Y:=abs(Y1 - Y2);
 
  Result:=X;
 
  if (Y*2 > X) then begin
    inc(X,X mod 2);
    dec(Y,X div 2);
    inc(Result,Y);
  end;
  if (Odd(X1) <> Odd(X2)) and (Result <> 1) then
   Inc(Result,1);

cmrudolph 17. Aug 2008 09:38

Re: Algorithmus gesucht: Abstand von zwei Hexagons
 
Edit:
gut, wenn der Code so läuft ;)

marabu 17. Aug 2008 10:30

Re: Algorithmus gesucht: Abstand von zwei Hexagons
 
Hallo,

ich würde ein anderes Koordinatensystem wählen. Zwei horizontal benachbarte Waben sollten eine Abszissendifferenz dX von 2 haben und zwei vertikal benachbarte Waben eine entsprechende Ordinatendifferenz dY.

Dann sollte gelten:

Code:
D = dy/2             | dX = 0
D = dx              | dY = 0 
D = dx + (dy - dx/2) | dY > dX
D = dy + (dx - dy)  | dX >= dY
Getippt und nicht getestet.

Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:01 Uhr.
Seite 1 von 2  1 2      

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