Я только что опубликовал библиотеку утилит с шестигранной сеткой на CodePlex.com здесь:
https://hexgridutilities.codeplex.com/
Библиотека включает поиск пути (используя A- * a la Eric Eric Lippert) и включает утилиты для автоматического преобразования между зубчатые (называемые пользователем) координаты и не зубчатые (называемые каноническими) координаты. Алгоритм поиска пути позволяет варьировать стоимость шага для каждого узла как в шестнадцатеричной, так и в шестнадцатеричной частях входа (хотя приведенный пример проще). Также предусмотрено повышенное поле зрения с использованием отбрасывания теней, [править: слова удалены].
Вот пример кода, который легко конвертируется между тремя шестигранными системами координат:
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 и IntVector2D являются целочисленными реализациями affine2D Graphics Vector и Matrix. Окончательное деление на 2 для векторных приложений заключается в повторной нормализации векторов; это может быть скрыто в реализации IntMatrix2D, но тогда причина 7-го аргумента для конструкторов IntMatrix2D менее очевидна. Обратите внимание на комбинированное кэширование и ленивую оценку нетоковых формулировок.
Эти матрицы для случая:
- Вершина шестигранного зерна;
- Начало координат слева вверху для канонических и пользовательских координат, слева внизу для пользовательских координат;
- Ось Y вертикально вниз;
- Прямоугольная ось X горизонтально поперек; и
- Каноническая ось Х к северо-востоку (т.е. вверх и вправо, на 120 градусов против часовой стрелки от оси Y).
Упомянутая выше библиотека кода обеспечивает такой же элегантный механизм для выбора гексагона (т. Е. Для идентификации гексагона, выбранного с помощью щелчка мыши).
В канонических координатах 6 кардинальных векторов направления равны (1,0), (0,1), (1,1) и их инверсиям для всех шестиугольников без асимметрии зубчатых координат.