Je viens de poster une bibliothèque d'utilitaires hex-grid sur CodePlex.com ici:
https://hexgridutilities.codeplex.com/
La bibliothèque comprend la recherche de chemin (en utilisant A- * a la Eric Lippert) et inclut des utilitaires pour la conversion automatisée entre coordonnées irrégulières (appelées utilisateur) et coordonnées non dentelées (appelées canoniques). L'algorithme de recherche de chemin permet au coût de l'étape pour chaque nœud de varier à la fois avec l'hex d'entrée et le côté hex parcouru (bien que l'exemple fourni soit plus simple). En outre, un champ de vision élevé utilisant la projection d'ombres est fourni, [modifier: mots supprimés].
Voici un exemple de code qui se convertit facilement entre trois systèmes de coordonnées à grille hexadécimale:
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 et IntVector2D sont des implémentations entières [modifier: homogènes] du vecteur graphique et de la matrice affine2D. La division finale par 2 sur les applications vectorielles consiste à re-normaliser les vecteurs; cela pourrait être enterré dans l'implémentation IntMatrix2D, mais alors la raison du 7ème argument aux constructeurs IntMatrix2D est moins évidente. Notez la mise en cache et l'évaluation paresseuse combinées des formulations non actuelles.
Ces matrices sont pour le cas:
- Grain hexagonal vertical;
- Origine en haut à gauche pour les coordonnées canoniques et utilisateur, en bas à gauche pour les coordonnées personnalisées;
- Axe Y verticalement vers le bas;
- Axe X rectangulaire horizontalement à travers; et
- Axe X canonique au nord-est (c'est-à-dire vers le haut et vers la droite, à 120 degrés CCW de l'axe Y).
La bibliothèque de codes mentionnée ci-dessus fournit un mécanisme tout aussi élégant pour la sélection d'hex (c.-à-d. Identifier l'hex sélectionné avec un clic de souris).
En coordonnées canoniques, les 6 vecteurs directeurs cardinaux sont (1,0), (0,1), (1,1) et leurs inverses pour tous les hexagones, sans l'assymétrie des coordonnées déchiquetées.