Предположим, у меня есть двумерная сетка, состоящая из непересекающихся треугольников и набора точек . Как лучше всего определить, в каком треугольнике лежит каждая из точек?
Например, на следующем изображении мы имеем , 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 - максимальное количество треугольников, прикрепленных к любому узлу в сетке. Есть несколько решаемых, но раздражающих проблем с этим подходом,
- Это требует реализации эффективного поиска ближайшего соседа (или поиска библиотеки, которая его имеет), что может быть нетривиальной задачей.
- Это требует хранения списка треугольников, прикрепленных к каждому узлу, для которого мой код в настоящее время не настроен - сейчас есть только список координат узла и список элементов.
В целом это кажется не элегантным, и я думаю, что должен быть лучший путь. Это должно быть проблемой, которая возникает часто, поэтому мне было интересно, кто-нибудь мог бы порекомендовать лучший способ приблизиться к поиску треугольников, в которых находятся узлы, теоретически или с точки зрения доступных библиотек.
Благодарность!