2015-09-14 3 views
2

Я работаю над небольшим проектом, который требует от меня быстро найти, какие треугольники внутри набора треугольников либо частично, либо полностью содержатся в данной прямоугольной области. Меня интересует оптимизация для быстрого поиска - я не ограничена памятью.Алгоритм поиска треугольников в пределах области

Это не та область, в которой я слишком хорошо знаком, поэтому все, что я смог сделать до сих пор, - это подталкивать Google к стандартным алгоритмам для решения этой проблемы. Ближе всего я дошел до того, чтобы использовать два интервала деревьев. Это немного неуклюжие, так как я должен выполнить проверку интервального перекрытия между краями каждого треугольника и краями прямоугольной области в обоих направлениях x и y.

Может кто-нибудь указать мне на любой ресурс, где «правильный» способ справиться с этой проблемой?

Спасибо!

Редактировать: Я забыл упомянуть, что прямоугольные области, которые я использую в настоящее время, параллельны осям координат x и y. На данный момент я доволен любым решением, которое использует это ограничение. В общем, хотя решение с совершенно произвольными прямоугольниками было бы полезно узнать.

+1

Являются ли стороны прямоугольных областей параллельными координатным осям (для этого есть слово, но я забыл об этом)? Если это так, вы можете использовать прямоугольники, окружающие ваши треугольники, для создания двумерных деревьев интервалов (или деревьев сегментов или деревьев деревьев или любых тех структур, которые называются), и посмотреть, эффективно ли эти проблемы решаются. –

+0

Справа. Это подход, который я принял. Это было все еще довольно медленно, но я не уверен, что реализация интервального дерева, которую я потянула, была хорошо оптимизирована. –

+0

Это немного специализированная версия обнаружения столкновений, которая хороша для поискового запроса. См. Например, http://q3k.org/gentoomen/Game%20Development/Programming/Real-Time%20Collision%20Detection.pdf – Gene

ответ

3

Вы можете использовать AABBTree (AABB обозначает ось выравнивание Ограничительной Box дерева), то идея заключается в том чтобы заключить каждый треугольник в свою выровненную по оси рамку, затем построить дерево, имеющее начальные треугольники в виде листьев, а верхние узлы имеют ограничивающий прямоугольник, который является объединением ограничивающих прямоугольников его дочерних элементов. Затем, когда поиск треугольников имеет непустое пересечение с «чем-то», вы проверяете, имеет ли «что-то» пересечение с ограничивающей рамкой узла, и спускайтесь по дереву, чтобы проверить его дети, когда это так (рекурсивная функция).

Вы можете найти эффективные реализации AABBTrees в:

+0

Да! Это именно то, что я хотел! –

1

Предполагая, что прямоугольник ось выравнивается, я бы это сделать:

  1. Сравнить ограничительную рамку треугольника в регион. Если он внутри, треугольник внутри. Если вообще нет перекрытия, это не так. Используйте дерево интервалов для каждого измерения для этого шага, если вам нужно проверить один и тот же набор треугольников с разными регионами.

  2. Мы проверили два простых случая на первом шаге, поэтому мы знаем, что область и перекрывающая область перекрываются. Проверьте, находится ли какая-либо из точек треугольника внутри прямоугольника. Если это так, треугольник внутри.

  3. Проверьте четыре стороны прямоугольника с трех сторон треугольника для сегмента линии пересечения

1

Если предварительная обработка набора треугольников не допускается, вам нечего лучше делать, чем сравнивать каждый треугольник с окном.

Чтобы решить проблему перекрытия треугольника/прямоугольника легко (или просто рассуждать об этом), вы можете сформировать сумму Минковского двух полигонов, чтобы превратить проблему в экземпляр «point-in-convex-polygon».

enter image description here

Конечно, начальный тест ограничивающего прямоугольника по оси выровнено приветствовать.

Если ваше окно является поворотным прямоугольником, вы можете «развернуть» всю сцену, чтобы выровнять по оси и перенести первую проблему.

Смежные вопросы