Рисовать шестигранную сетку во Flash?

Какой самый простой способ алгоритмически нарисовать гексагональную сетку? Как я должен представить их в данных?

Например, в квадратной сетке я мог бы просто сохранить координаты x-y.


person Timmy    schedule 20.11.2009    source источник
comment
шестнадцатеричные координаты, конечно! :П   -  person Matt Ball    schedule 21.11.2009


Ответы (2)


Таким образом, hexagon – это удобная библиотека для игр AS3. ваше исследование. В этой статье приводятся очень интересные сведения о шестиугольных плитках во Flash. .

person Joel Hooks    schedule 20.11.2009

Существует несколько способов управления координатами шестнадцатеричной карты, и большинство из них неинтуитивно настаивают на сопоставлении их с координатами x-y, что важно только для рендеринга. Обычно лучше использовать некоторую форму полярных координат. У меня есть библиотека perl для управления большинством векторных вычислений, которая очень полезна для вычислений с точки отсчета, таких как AI и другие деревья поиска.

http://en.wikipedia.org/wiki/Polar_coordinate_system

Для дешевых мест полярные координаты отображают точку в качестве начала (как стандартный x-y декартов график), выбирают вектор в качестве базовой линии (например, декартов), а затем обозначают точки как (величина, градусы).

Что действительно хорошо работает с шестнадцатеричными картами, так это то, что каждый чистый угол кратен 60 градусам. Если вы назначите каждой стороне шестиугольника ориентацию ((a,b,d,e,f,g) и примените вектор как величину и ориентацию, появится несколько полезных свойств.

1) Каждый гекс может быть представлен в виде суммы двух соседних векторов (или одного вектора, где второй вектор представляет собой величину 0 или элемент идентичности). например 1а+1б = 1а1б или 1б1а. В любом случае, это обход 2 гексов, величина 2, и обозначает уникальный гекс от начала координат (0,0). 2) Несмежные векторы всегда можно упростить до двух соседних векторов, применяя следующие правила: 2) Отрицание: 1A + 1D = 0, 1B + 1E = 0, 1C + 1F = 0, например. 3) Комбинация: 1A + 1C = 1B, 1B + 1D = 1C, 1C + 1E = 1D, 1D + 1F = 1E, 1E + 1A = 1F

Помня об этих принципах, ракета, которая должна пересечь реальное пространство, должна сохранять векторы как конкатенацию или порядок меньших перемещений. 1A + 1A + 1C + 1C представляет собой ракету, которая летит на два гекса вперед, а затем делает резкий крен (120 градусов) и летит на два гекса, заканчивая свой полет всего в 2 гексах от нас, но с отклонением на 60 градусов от своего первоначального направления.

Однако компьютер наведения или результирующий взрыв может заботиться только о расстоянии, поэтому упрощение этих векторов с использованием этих правил может быть важным. Чтобы вычислить кратчайшее расстояние между любыми двумя точками, просто соедините векторы и упростите их.

Также довольно легко создать шестнадцатеричную карту и визуализировать ее. Создайте шестнадцатеричный объект в качестве исходной точки со свойствами, Magnitude = 0, Vector = NULL, Label (необязательно) = некоторая строка (мне нравится делать это удобочитаемым значением), Name = 0 (конкатенация величины и вектора), а выходы = массив (вы заполните 6 узлов, исключая червоточины и т. д.). Постройте начало координат с центром в пикселе, который вы выбрали, чтобы сделать центр карты. Рендерим гекс. Выберите радиус для вашей карты

Foreach Magnitude, --- заполнить кольцо каждой комбинацией смежных векторов. Есть несколько способов сделать это, но самый простой — выбрать один вектор в качестве основы, а затем пройти гексы Величины в соответствующем направлении и по орбите с поворотом на 60 градусов. например Для величины 3 начните с 3E, затем перейдите к 3A, 3B, 3C, 3D, 3E, 3F, вычисляя каждый гекс как сумму последнего пройденного гекса и нового вектора одиночного гекса. --- В каждом из этих шестиугольников примените триггер, чтобы вычислить, где центральный пиксель должен быть относительно исходного пикселя, и визуализировать шестигранник.

Надеюсь, это поможет кому-то. Шестнадцатеричные карты рок. Рендеринг их немного отстой.

person Benjamin Colglazier    schedule 11.02.2011