Привет,
Я работаю над игровым проектом, в котором используется трехмерный вариант шестиугольных карт тайлов. Плитки на самом деле являются кубами, а не гексами, но выкладываются точно так же, как гексы (потому что квадрат можно превратить в куб для экстраполяции из 2D в 3D, но нет 3D-версии гекса). Вместо подробного описания приведем пример карты 4x4x4:
(я выделил произвольную плитку (зеленую) и смежные плитки (желтую), чтобы помочь описать, как все это должно работать, но функции смежности не проблема, это уже решено.)
У меня есть тип структуры для представления плиток, а карты представлены в виде трехмерного массива плиток (в класс Map
для добавления некоторых служебных методов, но это не очень важно).
Каждая плитка должна представлять собой идеально кубическое пространство, и все они точно одного размера. Кроме того, смещение между соседними «рядами» составляет точно , равное половине размера плитки.
Достаточно контекста; мой вопрос:
Учитывая координаты двух точек A
и B
, как я могу сгенерировать список плиток (или, скорее, их координат), которые будут пересекать прямая линия между A
и B
?
Это позже будет использоваться для различных целей, таких как определение прямой видимости, законности пути заряда и т. Д.
Кстати, это может быть полезно: мои карты используют (0,0,0) в качестве контрольной позиции. «Зазубренность» карты можно определить как смещение каждой плитки ((y+z) mod 2) * tileSize/2.0
вправо от позиции, которую она имела бы в «нормальной» декартовой системе. Для не зубчатых строк это дает 0; для строк, где (y+z) mod 2
равен 1, он дает 0,5 плитки.
Я работаю над C # 4, ориентируясь на .Net Framework 4.0; но мне не нужен конкретный код, только алгоритм для решения странной геометрической / математической задачи. Я несколько дней пытался решить это безрезультатно; и попытка нарисовать все это на бумаге, чтобы «визуализировать» это тоже не помогло :(.
Заранее спасибо за любой ответ