Hexagonkoordinaten bestimmen
-
Hi!
Ich habe mir ein Brett gebastelt, welches aus Hexagonen besteht.
Nun habe ich die Hexagonen auch alle mit 2 Indicies x, y durchnummeriert (Skizze).
Jetzt suche ich einen Formel um den Abstand in Koordinaten von 2 Hexagonen zu bestimmen. Der erste Ring um (0, 0) wäre Abstand 1.Also folgende Hexagonen haben den Abstand 1 von (0, 0):
(0, -1); (1, -1); (1, 0); (1, 1); (0, 1); (-1, 0);Abstand 2 haben alle äußeren Nachbarn von obigen Koordinaten, usw.
Mein Ansatz:
//Parameter: x1, y1 Koordinate eines Hexagons //Parameter: x2, y2 Koordinate eines anderen Hexagons int getDistance(int x1, int y1, int x2, int y2) { int dy = abs(centerTile.y - awayTile.y); int dx = abs(centerTile.x - awayTile.x); }
Wollte mit dx, dy weiterarbeiten aber es treten soviele Unregelmäßigkeiten auf.
Jemand eine Idee?
-
Wieso nummerierst du nicht entlang von zwei Achsen, die parallel zu zwei Hexagonseiten sind?
-
Hab nicht drüber nachgedacht wie ich nummerieren soll und habe dann einfach wie in 2d-Array durchnummeriert, wobei 2 Nachbarn "gesondert" sind. Das ist bei deiner vorgeschlagenen durchnummerierung aber nicht anders, da wird bei horizontalen direkten Nachbarn einfach ein Index "übersprungen".
-
So, ich habe jetzt eine Lösung gebastelt, für das von Numeri vorgeschlagene Koordinatensystem, die mit 4 Fallunterscheidungen auskommt. Jetzt brauch ich nurnoch eine Konvertierungsfunktion von den Arraykoordinaten(Mein erster Post) in die Hexakoordinanten(Numeris Post).
Vieleicht hat da Jemand einen Vorschlag?
-
Abstand in Koordinaten von 2 Hexagonen zu bestimmen
Also wieviel Hops ich brauche um von Ah nach Be zu kommen? Abstand ist ne Zahl oder meinst du den Verschiebungsvektor? Wieso musst du dann konvertieren? Benutze doch einfach insgesamt das andere Koordinatensystem.
-
Ja, die blauen Kreise auf der Skizze sind von innen nach außen Abstand 1, 2, 3,...
Und mein Problem ist, dass ich keine Formel finde die mir den Abstand(Ganze Zahl>=0) anhand von 2 Hexkoordinaten(Zahlen in den Hexagonen auf der Skizze) zurückgibt.
-
Konvertieren muss ich weil ich die euklidischen Koordinaten auch noch benötige z.B. für Arrayindicies oder Mauskoordinaten, usw.
-
Darüber gibt's doch schon etliche Abhandlungen im Net:
http://playtechs.blogspot.fr/2007/04/hex-grids.html
http://jemgine.omnisu.com/?page_id=412
http://www-cs-students.stanford.edu/~amitp/gameprog.html#hex
http://keekerdc.com/2011/03/hexagon-grids-coordinate-systems-and-distance-calculations/
http://3dmdesign.com/development/hexmap-coordinates-the-easy-way
...
-
Wenn ich mich verdüdelt habe:
int getDistance(int x1, int y1, int x2, int y2) { return max(abs(x1 - x2), abs(y1 - y2)); }
Dabei sind x1,y1,x2,y2 die "Koordinaten", wie sie in deiner Skizze eingezeichnet sind. Auf dem ersten blauen Kreis ist das Ergebnis 1, auf dem zweiten Kreis 2 etc
-
Mups schrieb:
Wenn ich mich verdüdelt habe:
Du hast dich verdüdelt.
-
Hab es jetzt selber gelöst. Sind 5 Zeilen um von kartesischen in Hexakoordinaten umzurechnen und die minimalen "Hops" zu ermitteln. Die meisten der Links hab ich schon durchgesehen und sie gehen bereits von einem geeigneten Koordinatensystem aus(welches ich nicht habe). Oder wenn es um Transformationen geht, dann kommen Overkilllösungen wo man schon irrationale Zahlen, Matrizen, Determinanten oder sonstwas benötigt, ich komme mit ganzen Zahlen aus. Für c++ spezifische Fragen ist das Forum Top, für Mathematische Lösungen die c++ freundlich sein sollen, ist diese Unterforum nicht geeignet.
Ich bedanke mich bei allen die sich Mühe gegeben haben mir zu helfen!
:xmas2:
-
Mr.Hexagon schrieb:
Für c++ spezifische Fragen ist das Forum Top, für Mathematische Lösungen die c++ freundlich sein sollen, ist diese Unterforum nicht geeignet
Tja, ich geb' keinen Deut drauf. Als ob du das einschaetzen kannst. Leider besitzen wir keine Glaskugeln, die dein Problem fuer uns hinreichend beleuchtet. Viele Wege fuehren nach Rom und die meisten haetten einen anderen gewaehlt.
Irrationale Zahlen, Matritzen oder Determinanten? Also 3x3 Matritzen oder 2 dimensionale Vektoren vereinfachen nur die Darstellung.