Acabei de publicar uma biblioteca de utilitários de grade hexadecimal no CodePlex.com aqui:
https://hexgridutilities.codeplex.com/
A biblioteca inclui localização de caminhos (usando A- * a Eric Lippert) e inclui utilitários para conversão automatizada entre cordadas irregulares (denominadas Usuário) e coordenadas não irregulares (denominadas Canonical). O algoritmo de localização de caminho permite que o custo da etapa para cada nó varie tanto com a entrada hexadecimal quanto com o lado hexagonal percorrido te (embora o exemplo fornecido seja mais simples). Além disso, é fornecido um campo de visão elevado usando projeção de sombras, [editar: palavras removidas].
Aqui está um exemplo de código que converte prontamente entre três sistemas de coordenadas de grade hexadecimal:
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 são implementações inteiras [edit: homogêneas] de affine2D Graphics Vector and Matrix. A divisão final por 2 nas aplicações vetoriais é normalizar novamente os vetores; isso pode estar oculto na implementação do IntMatrix2D, mas a razão do sétimo argumento para os construtores do IntMatrix2D é menos óbvia. Observe o cache combinado e a avaliação lenta de formulações não atuais.
Essas matrizes são para o caso:
- Grão hexagonal vertical;
- Origem no canto superior esquerdo para coordenadas canônicas e de usuário, e no canto inferior esquerdo para coordenadas personalizadas;
- Eixo Y verticalmente para baixo;
- Eixo X retangular horizontalmente; e
- Eixo X canônico para o nordeste (ou seja, para cima e para a direita, a 120 graus CCW do eixo Y).
A biblioteca de códigos mencionada acima fornece um mecanismo igualmente elegante para seleção hexadecimal (ou seja, identificar o hex selecionado com um clique do mouse).
Nas coordenadas canônicas, os 6 vetores de direção cardinais são (1,0), (0,1), (1,1) e seus inversos para todos os hexágonos, sem a assimetria de coordenadas irregulares.