cNoNim
Ужасная штука:)
Incvisitor
особенно если ее зациклить )))... она ведь сама в себя зацикливается, т.е. можно получить такую бесконечную гексогональную карту
я как раз три года назад интересовался этой темой
http://www.gamedev.ru/code/forum/?id=143357
правда в той теме ссылки уже все похерены,
да и я как то подзабросил это дело
Нашел ошибку в коде, которая раньше не проявлялась. В векторах были лишние добавочные координаты - удалил их.
cNoNim
А как с обратным преобразованием при такой формуле? Ведь важно по координатам точки узнать какому хексу она принадлежит.
Mikle
обратное преобразование есть в той статье,
но оно очень не эффективно,
/* Given a cartesian coordinate find the closest hex cell Very inefficient, does a linear search using HexCoord() Assumes you know the maximum range of your addresses Returns -1 if the closest is outside the SHM of 7^base */ long CoordHex(double x, double y, long base) { long i,closest=-1; double cx,cy; double dx,dy,dist,mindist=1e32; for ( i=0;i<HexPower( base);i++) { HexCoord( i,&cx,&cy); dx = cx - x; dy = cy - y; dist = dx*dx + dy*dy; if ( dist < mindist) { mindist = dist; closest = i; if ( mindist < 0.866) break; } } if ( mindist > 1) closest = -1; return( closest); }
я три года назад, пытался найти прямое преобразование, и теперь вот думаю возобновить поиски, правда не помню в чем именно там затык получился
ну так же надо литературу поперебирать, про SHM не одна статья в инете, правда очень сложно гуглится, потому как по разному называется
ну и да, все немного упрощается если перейти к кубической системе
остается вопрос как перевести из кубической системы координат в индекс
и помойму оно как то решалось, но были какие то проблемы
Mikle
тут такой вопрос, вот ты говоришь
Mikle
> важно по координатам точки узнать какому хексу она принадлежит.
можно накидать задачи для, которых это важно?
просто я вот уже набросал несколько способов, рекурсивного определения хекса, но я все больше и больше понимаю,
что SHM это все больше отдельная система координат, и чисто технически лучше работать прямо в ней, и думать что один хекс это точка, либо центр хекса это координата объекта
а по SHM можно и перемещаться, SHM можно трассировать
единственный открытый вопрос это допустим выбор координаты мышью
можно конечно на каждое передвижение мыши рекурсивно через гору тригонометрических функций определять координаты
но есть так же альтернативное решение определять координаты при трассировке SHM во время вывода на экран и определения хекса в который попадает координата
при этом для того что бы не было задержек, при обработке событий можно скидывать все события мыши в очередь, и определять всю очередь во время трассировки
возможно будует задержка на один кадр правда
cNoNim
> можно накидать задачи для, которых это важно?
Ты их сам уже накидал:
cNoNim
> можно конечно на каждое передвижение мыши рекурсивно через гору
> тригонометрических функций определять координаты
> но есть так же альтернативное решение определять координаты при трассировке SHM
> во время вывода на экран и определения хекса в который попадает координата
> при этом для того что бы не было задержек, при обработке событий можно
> скидывать все события мыши в очередь, и определять всю очередь во время
> трассировки
> возможно будует задержка на один кадр правда
А у меня вместо этого:
SX = X * 2 / cW IX = Int(SX) SX = SX - IX SY = Y * 4 / (cH * 3) IY = Int(SY) If (IX And 1) Xor (IY And 1) Then SY = SY + SX / 3 Else SY = SY + (1 - SX) / 3 End If IY = Int(SY) IX = Int((IX - IY) * 0.5)
Никакой тригонометрии, рекурсии, даже циклов.
А как ты определяешь индекс соседа, чтобы туда пойти, к примеру, или узнать, что там стена? У меня - проще не придумать:
"x-1,y" - сосед слева,
"x+1,y-1" - сосед справа вверху.
И так далее.
Mikle
для shm есть таблица сложения в семеричной системе счисления
т.е все шесть соседей это
i+[1-6]
cNoNim
А для чего это хрень нужна?
главный профит SHM в том что это рекурсивная структура
т.е. подобно квадтри
и может использоваться для разбиения пространства, и получения разнообразных плюшек
разница лишь в том что квадтри оперирует пространствами,
а SHM оперирует точками, точнее не точками, а семерками гексов
минимальная структура SHM это
cNoNim
Фрактал.
cNoNim
> главный профит SHM в том что это рекурсивная структура
> т.е. подобно квадтри
А в чём профит таких рекурсивных структур, кроме оптимизации? А зачем такая оптимизация нужна на регулярной сетке? Ведь это же регулярная сетка, хоть и не прямоугольная.
Кроме того, эта оптимизация отжирает на свою работу больше вычислительных ресурсов, чем даёт выигрыша. Кроме то, неодинаковая зависимость индексов соседей, вынуждающая пользоваться таблицей, будет сильно путать программиста, а тут ещё семеричная система...
Фрактал - да, красивый, единственный профит - эстетический.
Хорошая идея, я тоже долго с этим бился, костылей нагородил ^_^
А маппер обратного преобразования так и не смог сколько бы нибудь адекватный придумать.
Поэтому на этот демо-проект забил быстро )
P.S. давно ещё видел похожую реализацию через хэш таблицу ) но тоже не осилил )
Короче, смог каким-то чудом (решил заюзать подобную тему для игры в конкурсе (https://gamedev.ru/projects/forum/?id=242302)) улучшить оригинальный код до фактически одного три-вложенного цикла.
Тема в архиве.