Acabo de publicar una biblioteca de utilidades de cuadrícula hexadecimal en CodePlex.com aquí:
https://hexgridutilities.codeplex.com/
La biblioteca incluye la búsqueda de rutas (usando A- * a la Eric Lippert) e incluye utilidades para la conversión automática entre cordones irregulares (denominados Usuario) y coordenadas no irregulares (denominados canónicos). El algoritmo de búsqueda de ruta permite que el costo del paso para cada nodo varíe tanto con el hexágono de entrada como con el lado hexagonal atravesado (aunque el ejemplo proporcionado es más simple). Además, se proporciona un campo de visión elevado mediante la proyección de sombras, [editar: palabras eliminadas].
Aquí hay una muestra de código que se convierte fácilmente entre tres sistemas de coordenadas de cuadrícula 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 son implementaciones enteras [editar: homogéneas] de affine2D Graphics Vector y Matrix. La división final por 2 en las aplicaciones de vector es volver a normalizar los vectores; esto podría estar oculto en la implementación de IntMatrix2D, pero la razón del séptimo argumento para los constructores de IntMatrix2D es menos obvia. Tenga en cuenta el almacenamiento en caché combinado y la evaluación diferida de las formulaciones no actuales.
Estas matrices son para el caso:
- Hexagonal de grano vertical;
- Origen en la esquina superior izquierda para coordenadas canónicas y de usuario, en la esquina inferior izquierda para coordenadas personalizadas;
- Eje Y verticalmente hacia abajo;
- Eje X rectangular horizontalmente a través; y
- Eje X canónico hacia el noreste (es decir, hacia arriba y hacia la derecha, a 120 grados CCW desde el eje Y).
La biblioteca de códigos mencionada anteriormente proporciona un mecanismo igualmente elegante para la selección hexadecimal (es decir, identificar el hexadecimal seleccionado con un clic del mouse).
En coordenadas canónicas, los 6 vectores de dirección cardinales son (1,0), (0,1), (1,1) y sus inversas para todos los hexágonos, sin la asimetría de las coordenadas irregulares.