![]() |
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 |
Re: Algorithmus gesucht: Abstand von zwei Hexagons
Screenshot?
|
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 |
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; |
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. |
Re: Algorithmus gesucht: Abstand von zwei Hexagons
Wenn mir kein Fehler unterlaufen ist, dann funktioniert dieser Quellcode:
Delphi-Quellcode:
Edit: an Index beginnend bei 0 angepasst
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 2: Exit entfernt Edit 3: Code funktioniert noch nicht 100%ig - Beispiel: 2-2 9-6 Edit 4: Fix |
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:
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 ;-)
if Odd(X1) <> Odd(X2) then
Inc(Result,1); |
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); |
Re: Algorithmus gesucht: Abstand von zwei Hexagons
Edit:
gut, wenn der Code so läuft ;) |
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:
Getippt und nicht getestet.
D = dy/2 | dX = 0
D = dx | dY = 0 D = dx + (dy - dx/2) | dY > dX D = dy + (dx - dy) | dX >= dY Grüße vom marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:01 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