Spatial hashing как реализовать в unity?
как реализовать spatial hashing для поиска ближайших точечных объектов на плоскости, чтобы проверять только соседние области, правильно учитывать отрицательные координаты и обновлять индекс при движении
Компьютеры и связь
Развлечения
Нейросети, ИИ
Животные и питомцы
как реализовать spatial hashing для поиска ближайших точечных объектов на плоскости, чтобы проверять только соседние области, правильно учитывать отрицательные координаты и обновлять индекс при движении
Для точечных объектов на плоскости 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. Эта последняя проверка отсекает точки в углах прямоугольника, которые не входят в круг запроса. Сам запрашивающий объект исключите сравнением ссылок, если он тоже хранится в индексе. Для первого рабочего варианта пересобирайте индекс после обновления позиций и до запросов. Затем при необходимости отслеживайте переход между ячейками: удаляйте объект из старого списка и добавляйте в новый. Если оставить старую запись после движения, поиск начнёт пропускать близкие объекты или возвращать дальние. Проверьте пример на границе ячеек и рядом с отрицательным нулём. Такой индекс ускоряет выбор кандидатов при подходящем распределении точек, но не гарантирует выигрыш, если почти все объекты попали в один список.
4.20
Храните координаты целиком, не только GetHashCode.
Пока нет премиум-вопросов в подборке
Не нашли то, что искали?
Задайте свой вопрос
Ответить на вопрос