Войти
Исаев ВикторФорум

Простая генерация гексагональной (шестиугольной) сетки из центра + поворот матрицы на любой угол. Апгрейд 2019 года (комментарии) (2 стр)

Страницы: 1 2
#15
14:51, 13 янв. 2014

cNoNim
Ужасная штука:)

#16
14:57, 13 янв. 2014

Incvisitor
особенно если ее зациклить )))... она ведь сама в себя зацикливается, т.е. можно получить такую бесконечную гексогональную карту
я как раз три года назад интересовался этой темой
http://www.gamedev.ru/code/forum/?id=143357
правда в той теме ссылки уже все похерены,
да и я как то подзабросил это дело

#17
17:23, 13 янв. 2014

Нашел ошибку в коде, которая раньше не проявлялась. В векторах были лишние добавочные координаты - удалил их.

#18
20:40, 13 янв. 2014

cNoNim
А как с обратным преобразованием при такой формуле? Ведь важно по координатам точки узнать какому хексу она принадлежит.

#19
21:37, 13 янв. 2014

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 не одна статья в инете, правда очень сложно гуглится, потому как по разному называется
ну и да, все немного упрощается если перейти к кубической системе
остается вопрос как перевести из кубической системы координат в индекс
и помойму оно как то решалось, но были какие то проблемы
#20
13:50, 14 янв. 2014

Mikle
тут такой вопрос, вот ты говоришь
Mikle
> важно по координатам точки узнать какому хексу она принадлежит.
можно накидать задачи для, которых это важно?

просто я вот уже набросал несколько способов, рекурсивного определения хекса, но я все больше и больше понимаю,
что SHM это все больше отдельная система координат, и чисто технически лучше работать прямо в ней, и думать что один хекс это точка, либо центр хекса это координата объекта

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

#21
14:32, 14 янв. 2014

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" - сосед справа вверху.
И так далее.
#22
15:19, 14 янв. 2014

Mikle
для shm есть таблица сложения в семеричной системе счисления
т.е все шесть соседей это
i+[1-6]                                                                                                                                                 

#23
15:48, 14 янв. 2014

cNoNim
А для чего это хрень нужна?

#24
15:49, 14 янв. 2014

главный профит SHM в том что это рекурсивная структура
Recursive SHM | Простая генерация гексагональной (шестиугольной) сетки из центра + поворот матрицы на любой угол. Апгрейд 2019 года (комментарии)
т.е. подобно квадтри
и может использоваться для разбиения пространства, и получения разнообразных плюшек
разница лишь в том что квадтри оперирует пространствами,
а SHM оперирует точками, точнее не точками, а семерками гексов
минимальная структура SHM это
SHM Point | Простая генерация гексагональной (шестиугольной) сетки из центра + поворот матрицы на любой угол. Апгрейд 2019 года (комментарии)

#25
15:54, 14 янв. 2014

cNoNim
Фрактал.

#26
16:56, 14 янв. 2014

cNoNim
> главный профит SHM в том что это рекурсивная структура
> т.е. подобно квадтри
А в чём профит таких рекурсивных структур, кроме оптимизации? А зачем такая оптимизация нужна на регулярной сетке? Ведь это же регулярная сетка, хоть и не прямоугольная.
Кроме того, эта оптимизация отжирает на свою работу больше вычислительных ресурсов, чем даёт выигрыша. Кроме то, неодинаковая зависимость индексов соседей, вынуждающая пользоваться таблицей, будет сильно путать программиста, а тут ещё семеричная система...
Фрактал - да, красивый, единственный профит - эстетический.

#27
22:48, 10 фев. 2014

Хорошая идея, я тоже долго с этим бился, костылей нагородил ^_^

А маппер обратного преобразования так и не смог сколько бы нибудь адекватный придумать.
Поэтому на этот демо-проект забил быстро )

P.S. давно ещё видел похожую реализацию через хэш таблицу  ) но тоже не осилил )

Прошло более 5 лет
#28
(Правка: 16:55) 16:55, 26 мар. 2019

Короче, смог каким-то чудом (решил заюзать подобную тему для игры в конкурсе (https://gamedev.ru/projects/forum/?id=242302)) улучшить оригинальный код до фактически одного три-вложенного цикла.

Страницы: 1 2
Исаев ВикторФорум