Щойно я розмістив на CodePlex.com бібліотеку шістнадцяткових утиліт:
https://hexgridutilities.codeplex.com/
Бібліотека включає пошук шляхів (використовуючи A- * a la 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. Остаточний поділ на 2 у векторних додатках - це повторна нормалізація векторів; це може бути поховано в реалізації IntMatrix2D, але тоді причина 7-го аргументу конструкторам IntMatrix2D менш очевидна. Зверніть увагу на комбіноване кешування та ледачу оцінку поточних рецептів.
Ці матриці є для випадку:
- Шестигранна зерна вертикальна;
- Походження вліво зліва для канонічних та користувальницьких координат, ліворуч для лівих координат;
- Вісь Y вертикально вниз;
- Прямокутна вісь X горизонтально поперек; і
- Канонічна вісь X на північний схід (тобто вгору та праворуч, на 120 градусів CCW від осі Y).
Згадана вище бібліотека коду забезпечує аналогічно елегантний механізм вибору шістнадцяткових значень (тобто ідентифікації шестигранника, вибраного натисканням миші).
У канонічних координатах 6 векторів кардинального напрямку - це (1,0), (0,1), (1,1) та їх обертання для всіх шестикутників, без асиметрії зубчастих координат.