Предположим, у меня есть двумерная сетка, состоящая из непересекающихся треугольников и набора точек . Как лучше всего определить, в каком треугольнике лежит каждая из точек?
Например, на следующем изображении мы имеем , p 2 ∈ T 4 , p 3 ∈ T 2 , поэтому я хотел бы функцию f, которая возвращает список f ( p 1 , p 2 , p 3 ) = [ 2 , 4 , 2 ] .
Matlab имеет функцию pointlocation, которая делает то, что я хочу для сеток Делоне, но не работает для общих сеток.
Моя первая (тупая) мысль, что для всех узлов нужно пройти через все треугольники, чтобы выяснить, в каком треугольнике находится p i . Однако это крайне неэффективно - вам, возможно, придется пройти через каждый треугольник для каждой точки, поэтому это может занять O ( N ⋅ M ) работы.
Моя следующая мысль: для всех точек найти ближайший узел сетки с помощью поиска ближайших соседей, а затем просмотреть треугольники, прикрепленные к этому ближайшему узлу. В этом случае работа была бы O ( a ⋅ M ⋅ l o g ( N ) ) , где a - максимальное количество треугольников, прикрепленных к любому узлу в сетке. Есть несколько решаемых, но раздражающих проблем с этим подходом,
- Это требует реализации эффективного поиска ближайшего соседа (или поиска библиотеки, которая его имеет), что может быть нетривиальной задачей.
- Это требует хранения списка треугольников, прикрепленных к каждому узлу, для которого мой код в настоящее время не настроен - сейчас есть только список координат узла и список элементов.
В целом это кажется не элегантным, и я думаю, что должен быть лучший путь. Это должно быть проблемой, которая возникает часто, поэтому мне было интересно, кто-нибудь мог бы порекомендовать лучший способ приблизиться к поиску треугольников, в которых находятся узлы, теоретически или с точки зрения доступных библиотек.
Благодарность!
Я не уверен, что ваше решение на самом деле правильно. Рассмотрим ситуацию, когда у вас есть эти узлы:
Есть треугольники ABC и ACD. Теперь B является ближайшей точкой к началу координат, но начало координат находится в треугольнике ACD, который не содержит B.
Я бы рассмотрел вариант построения квадродерева, которое содержит сами треугольники. Т.е. у вас есть четвертичное дерево, которое хранится в каждом узле (что соответствует ограничительной рамке):
источник
CGAL обрабатывает триангуляции и локацию точек (и многое другое). В частности, модуль 2D триангуляции может делать то, что вы хотите.
источник