Ich habe gerade eine Bibliothek mit Hex-Grid-Anwendungen auf CodePlex.com veröffentlicht:
https://hexgridutilities.codeplex.com/
Die Bibliothek enthält die Pfadfindung (unter Verwendung von A- * a la Eric Lippert) und Anwendungen für die automatisierte Konvertierung zwischen gezackte (als Benutzer bezeichnete) Koordinaten und nicht gezackte (als kanonisch bezeichnete) Koordinaten. Der Pfadfindungsalgorithmus ermöglicht, dass die Schrittkosten für jeden Knoten sowohl mit dem Eingangshex als auch mit der durchquerten Hex-Seite variieren (obwohl das bereitgestellte Beispiel einfacher ist). Es wird auch ein erhöhtes Sichtfeld mit Schattenwurf bereitgestellt [Bearbeiten: Wörter entfernt].
Hier ist ein Codebeispiel, das problemlos zwischen drei Hex-Gitter-Koordinatensystemen konvertiert werden kann:
static readonly IntMatrix2D MatrixUserToCanon = new IntMatrix2D(2,1, 0,2, 0,0, 2);
IntVector2D VectorCanon {
get { return !isCanonNull ? vectorCanon : VectorUser * MatrixUserToCanon / 2; }
set { vectorCanon = value; isUserNull = isCustomNull = true; }
} IntVector2D vectorCanon;
bool isCanonNull;
static readonly IntMatrix2D MatrixCanonToUser = new IntMatrix2D(2,-1, 0,2, 0,1, 2);
IntVector2D VectorUser {
get { return !isUserNull ? vectorUser
: !isCanonNull ? VectorCanon * MatrixCanonToUser / 2
: VectorCustom * MatrixCustomToUser / 2; }
set { vectorUser = value; isCustomNull = isCanonNull = true; }
} IntVector2D vectorUser;
bool isUserNull;
static IntMatrix2D MatrixCustomToUser = new IntMatrix2D(2,0, 0,-2, 0,(2*Height)-1, 2);
static IntMatrix2D MatrixUserToCustom = new IntMatrix2D(2,0, 0,-2, 0,(2*Height)-1, 2);
IntVector2D VectorCustom {
get { return !isCustomNull ? vectorCustom : VectorUser * MatrixUserToCustom / 2; }
set { vectorCustom = value; isCanonNull = isUserNull = true; }
} IntVector2D vectorCustom;
bool isCustomNull;
IntMatrix2D und IntVector2D sind [edit: homogene] Integer-Implementierungen von affine2D Graphics Vector und Matrix. Die letzte Division der Vektoranwendungen durch 2 besteht darin, die Vektoren neu zu normalisieren. Dies könnte in der IntMatrix2D-Implementierung begraben sein, aber der Grund für das 7. Argument für die IntMatrix2D-Konstruktoren ist weniger offensichtlich. Beachten Sie die kombinierte Zwischenspeicherung und verzögerte Bewertung nicht aktueller Formulierungen.
Diese Matrizen sind für den Fall:
- Hex korn vertikale;
- Ursprung links oben für kanonische und Benutzerkoordinaten, links unten für benutzerdefinierte Koordinaten;
- Y-Achse senkrecht nach unten;
- Rechteckige X-Achse horizontal über; und
- Kanonische X-Achse nach Nordosten (dh nach oben und rechts, um 120 Grad nach links von der Y-Achse).
Die oben erwähnte Codebibliothek bietet einen ähnlich eleganten Mechanismus für das Hex-Picking (dh das Identifizieren des ausgewählten Hex mit einem Mausklick).
In kanonischen Koordinaten sind die 6 Kardinalrichtungsvektoren (1,0), (0,1), (1,1) und ihre Inversen für alle Sechsecke ohne die Asymmetrie gezackter Koordinaten.