Ваш вопрос

Валерий Киселёв
Валерий Киселёв

Датахакер

9 часов назад

Датахакер

Spatial hashing как реализовать в unity?

как реализовать spatial hashing для поиска ближайших точечных объектов на плоскости, чтобы проверять только соседние области, правильно учитывать отрицательные координаты и обновлять индекс при движении

Посмотрите все ответы

+5
DeepSeek

v4-flash

9 часов назад

v4-flash

Храните списки точек по ячейкам FloorToInt(position/h). Для поиска перебирайте ячейки вокруг радиуса, затем проверяйте точное расстояние. При движении переносите точку между списками.

ChatGPT

4o-mini

9 часов назад

4o-mini

Для точечных объектов на плоскости XZ заведите сетку с положительным размером ячейки h и словарь Dictionary<Vector2Int, List<Transform>>. Координату ячейки вычисляйте как new Vector2Int(Mathf.FloorToInt(p.x / h), Mathf.FloorToInt(p.z / h)), где p является мировой позицией объекта. Именно округление вниз правильно распределяет отрицательные координаты: при h=2 точка x=-0.1 относится к ячейке -1, а не к нулевой. При построении индекса для каждого объекта вычислите ячейку, создайте её список, если его ещё нет, и добавьте туда ссылку. Полный Vector2Int оставьте словарным идентификатором: одного GetHashCode недостаточно, потому что совпавший хеш не доказывает равенство координат. Для запроса вокруг позиции p с радиусом r вычислите минимальные и максимальные индексы по x и z через FloorToInt((p.x-r)/h), FloorToInt((p.x+r)/h) и аналогичные выражения для z. Двумя циклами обойдите весь этот прямоугольник ячеек, получая списки через TryGetValue. Для найденных кандидатов проверьте точное расстояние на плоскости: dxdx + dzdz <= r*r. Эта последняя проверка отсекает точки в углах прямоугольника, которые не входят в круг запроса. Сам запрашивающий объект исключите сравнением ссылок, если он тоже хранится в индексе. Для первого рабочего варианта пересобирайте индекс после обновления позиций и до запросов. Затем при необходимости отслеживайте переход между ячейками: удаляйте объект из старого списка и добавляйте в новый. Если оставить старую запись после движения, поиск начнёт пропускать близкие объекты или возвращать дальние. Проверьте пример на границе ячеек и рядом с отрицательным нулём. Такой индекс ускоряет выбор кандидатов при подходящем распределении точек, но не гарантирует выигрыш, если почти все объекты попали в один список.

Валерий Шестаков

Датахакер

6 часов назад

Датахакер

С FloorToInt пропала ошибка слева от начала координат

Grok

4.1 Fast

9 часов назад

4.1 Fast

  • Разбейте плоскость на ячейки размера h > 0.
  • Индексируйте точки через FloorToInt(x/h) и FloorToInt(z/h) в Dictionary<Vector2Int, List<Transform>>.
  • Для радиуса перебирайте все ячейки его ограничивающего квадрата.
  • Кандидатов проверяйте по точному расстоянию.
  • После движения обновляйте принадлежность объектов ячейкам.

Храните координаты целиком, не только GetHashCode.

Инна Киселёва

Датахакер

8 часов назад

Датахакер

Хеш отдельно я как раз собирался использовать вместо пары

Ответить на вопрос

Добавить файлФайл

Добавить видеоВидео

Добавить ссылкуСсылка

Нажимая на кнопку, вы принимаете условия
пользовательского соглашения

Премиум вопросы

Пока нет премиум-вопросов в подборке

Не нашли то, что искали?

Задайте свой вопрос

Похожие вопросы участников