Тест точки в Делоне из облака точек без сетки

Возможно ли, имея произвольную точку P и предполагая, что я могу найти близлежащие (несвязанные) точки, отсортированные по расстоянию, эффективно определить три близлежащие точки, образующие треугольник Делоне, содержащий P? Если да, то как?


person cteffects    schedule 04.04.2012    source источник


Ответы (1)


Я предполагаю, что вы находитесь в 2D без коллинеарных точек. То, что я предлагаю, работает и в 3D. Постройте Kd-дерево, содержащее все точки. Затем найдите двух ближайших соседей точки P. Постройте описанную окружность.

Рассмотрим центр этого круга и найдем его ближайших соседей. Если первая точка, которую вы найдете (игнорируя точки треугольника), находится дальше радиуса круга, то у вас есть треугольник. В противном случае нарушается свойство пустого круга, и в этом случае вы знаете, что точка находится вне треугольника. Теперь вы можете определить два треугольника и проверить, что свойство пустого круга проверено, как и раньше (но в случае, если вы найдете точку в круге, я думаю, вам нужно проверить, находится ли точка внутри треугольника). Тогда это похоже на триангуляцию Делоне со всеми четырьмя точками и всеми остальными точками, которые вы найдете внутри описанной окружности.

Для реализации вы можете использовать, например, CGAL, который предоставляет Orthogonal_incremental_nearest_neighbor, функция has_on_bounded_side из класса Triangle_2 и функция circumcenter.

Вы также можете напрямую использовать Delaunay_triangulation_2 класс, инициализированный тремя первыми точками, и постепенно вставлять точки, делающие недействительным свойство пустого круга треугольных граней.

person sloriot    schedule 05.04.2012
comment
Это звучит как отличное решение! Я дам ему попробовать. - person cteffects; 06.04.2012