Задать вопрос
Wohlstand
@Wohlstand
Инженер-программист С++

Как быстро найти группу объектов в массиве, попадающих в выбранную зону по координатам Лево-Верх-Право-Низ?

Есть массив классов, каждый из которых - объект на плоскости.

Все объекты - прямоульники. Кроме координат X-Y и высоты-ширины W-H, классы могут возвращать координаты сторон L-T-R-B. В массиве может присутствовать от 3000 до 40000 и более объектов суммарно.

Задача: организовать быстрый поиск группы элементов, которые попадают в зону по координатам Лево-Верх-Право-Низ, что нужно для обнаружения столкновений и отбора элементов на отрисовку.
  • Многие объекты статичны, но некоторые из них могут двигаться в произвольной форме (обычно от 400 до 10000, но может быть и больше).
  • Иногда возможно движение и статических объектов:
    • если их группа "приклеплена" к динамическому объекту (полное повторение его движений)
    • линейное движение с заданными скоростями X/Y.


Элементы в массиве по-умолчанию размещены хаотично, но при необходимости могу легко организовать сортировку их всех по X-Y координатам
  • Вопрос задан
  • 2242 просмотра
Подписаться 2 Оценить Комментировать
Решения вопроса 1
Lerg
@Lerg
Defold, Corona, Lua, GameDev
Быстрый поиск столкновений это нетривиальная задача. Но, благо, она уже изучена.
gamedevelopment.tutsplus.com/tutorials/quick-tip-u...
en.wikipedia.org/wiki/Quadtree
en.wikipedia.org/wiki/Collision_detection
www.java-gaming.org/index.php?topic=29244.0
staticvoidgames.com/tutorials/intermediateConcepts...

В зависимости от поведения ваших объектов, возможно придумать что-то более эффективное (более узконаправленное). Обычно это либо слежение в районе какой-то одной точки, либо кэширование результатов.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
SHVV
@SHVV
Я для оптимизации поиска обычно сеточку использую. Просто и эффективно.

То есть, строите двумерный массив, в каждом элементе которого список всех объектов, попавших в эту ячейку.
При перемещении объекта необходимо обновлять и его положение в сетке.
Соответственно, для поиска достаточно проверить все ячейки, в которые попадает объект, собрать список потенциальных кандидатов на пересечение и проверить каждого из них.

Если пространство сильно не онородное (то есть есть много разбитых далеко кучек объектов), то регулярная сетка становится сильно не эффективной с точки зрения потребления памяти, тогда лучше строить дерево сортировки (k-d, Quad, Binary).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы