Ho appena pubblicato una libreria di utilities a griglia esadecimale su CodePlex.com qui:
https://hexgridutilities.codeplex.com/
La libreria include il percorso di ricerca (utilizzando A- * a la Eric Lippert) e include utility per la conversione automatica tra coordinate frastagliate (definite come utenti) e coordinate non frastagliate (definite canoniche). L'algoritmo di ricerca del percorso consente al costo del passaggio per ciascun nodo di variare sia con l'esagono di entrata che con il lato esagonale attraversato (sebbene l'esempio fornito sia più semplice). Inoltre, viene fornito un campo visivo elevato usando il casting ombra, [modifica: parole rimosse].
Ecco un esempio di codice che converte facilmente tra tre sistemi di coordinate a griglia esadecimale:
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 e IntVector2D sono implementazioni intere [modifica: omogenee] di affine2D Graphics Vector e Matrix. La divisione finale per 2 sulle applicazioni vettoriali è di ri-normalizzare i vettori; questo potrebbe essere sepolto nell'implementazione di IntMatrix2D, ma quindi la ragione del settimo argomento per i costruttori IntMatrix2D è meno ovvia. Si noti la memorizzazione nella cache combinata e la valutazione lazy delle formulazioni non correnti.
Queste matrici sono per il caso:
- Grano esagonale verticale;
- Origine in alto a sinistra per coordinate canoniche e utente, in basso a sinistra per coordinate personalizzate;
- Asse Y verticalmente verso il basso;
- Asse X rettangolare in senso orizzontale; e
- Asse X canonico verso nord-est (cioè verso l'alto e verso destra, a 120 gradi in senso antiorario dall'asse Y).
La libreria di codici sopra menzionata fornisce un meccanismo altrettanto elegante per il picking esadecimale (ovvero identificare l'esagono selezionato con un clic del mouse).
Nelle coordinate canoniche, i 6 vettori di direzione cardinali sono (1,0), (0,1), (1,1) e le loro inversioni per tutti gli esagoni, senza l'assimmetria dei coordini frastagliati.