Zuerst einmal - ich weiß, dass ich hier sehr dicht bin.
Damit versuche ich, eine C # -Implementierung dieses Algorithmus zu schreiben:
var results = []
for each -N ≤ dx ≤ N:
for each max(-N, -dx-N) ≤ dy ≤ min(N, -dx+N):
var dz = -dx-dy
results.append(cube_add(center, Cube(dx, dy, dz)))
Ich habe dies aus dieser enormen Ressource genommen.
Mein Problem ist, dass jede Implementierung, die ich bisher ausprobiert habe, verrückte Ergebnisse erzielt hat. Der unten gezeigte Code führt derzeit beispielsweise dazu:
und das:
Mein Code sieht derzeit so aus:
for (int x = this.CellPositionX - distance; x <= this.CellPositionX + distance; x++)
{
for (int y = this.CellPositionY - Math.Max(-distance, -x - distance); y <= this.CellPositionY + Math.Min(distance, -x + distance); y++)
{
HexPosition rangePosition = new HexPosition(x, y);
range.Add(rangePosition);
}
}
Kann hier jemand etwas Falsches erkennen? Alle Vorschläge sind willkommen. Ich habe jetzt schon eine Weile meinen Kopf darauf geschlagen.
Vielen Dank!
Aktualisierter Hinweis: Ich verwende Axialkoordinaten im Raster. Update Nr. 2: Wie unten erwähnt, hatte ich meine for..each-Schleife falsch und verwendete keine Deltas für das Training. Danke für die Hilfe!
Ich habe derzeit ein Problem wie unten gezeigt mit der Implementierung aus den Antworten:
Ich werde weiter nachforschen - wenn ich es herausfinde, werde ich die vollständigen Ergebnisse hier veröffentlichen. Vielen Dank an alle!
quelle
Antworten:
Bei näherer Betrachtung hat Ihr Problem also nichts mit Koordinatensystemkonvertierungen zu tun. Dies hätte deutlicher gemacht werden können, indem Sie nicht Ihre Axialkoordinaten X und Y, sondern Q und R benannt haben. Das Problem, das Sie tatsächlich haben, sind schlechte Schleifenbedingungen. Das ursprüngliche Codebeispiel erzeugt Delta-Qs und -Rs, die Sie in Ihren for-Schleifen in absolute Koordinaten konvertieren möchten, und Sie haben einen Fehler gemacht. Der Algorithmus sollte stattdessen wie folgt aussehen:
quelle
Wie Vector57 feststellte, besteht das Problem darin, dass Sie das falsche Koordinatensystem verwenden . Der beschriebene Algorithmus soll mit Würfelkoordinaten verwendet werden , die x-, y- und z-Komponenten haben :
Dies kann nicht aus dem Algorithmus des Pseudo - Code offensichtlich sein, aber das ist , weil es sich um eine Vereinfachung der ist dies :
... eine einfache verschachtelte Schleife über x, y und z, was Sie von einem Bereichsalgorithmus erwarten würden.
Ich weiß nicht, welches Koordinatensystem Sie verwenden, aber ich vermute, es ist eines der "Versatzkoordinatensysteme", die beliebt sind, weil sie einfach zu implementieren sind, indem die Gitterzellen in einem 2D-Array platziert werden:
Dies bedeutet nicht, dass Sie diese Cube-Algorithmen nicht verwenden können. es bedeutet nur, dass Sie müssen von den Würfelkoordinaten in Ihre eigenen konvertieren . Verwenden Sie beispielsweise Folgendes, um in das vertikale Layout "odd-q" zu konvertieren:
quelle
q = x
und einr = y
System?