Алгоритм упрощения 3d поверхности?
У меня есть набор 3d-точек, которые приближаются к поверхности. Каждый пункт, однако, подвержен некоторой ошибке. Кроме того, набор точек содержит намного больше точек, чем необходимо для представления подстилающей поверхности.
то, что я ищу, - это алгоритм создания нового (гораздо меньшего) набора точек, представляющих упрощенную, более гладкую версию поверхности (простите, что у вас нет лучшего определения, чем "упрощенная, более гладкая"). Подстилающей поверхности не математический, поэтому я не надеюсь, что набор данных будет соответствовать какой-то математической функции.
7 ответов
вместо того, чтобы рассматривать его как облако точек, я бы рекомендовал триангулировать сетку с помощью триангуляции Делоне:http://en.wikipedia.org/wiki/Delaunay_triangulation
затем уничтожьте сетку. Вы можете исследовать алгоритмы децимации, но вы можете получить довольно хорошие быстрые и грязные результаты с алгоритмом, который просто объединяет соседние Трис, которые имеют похожие нормали.
Я думаю, вы ищете алгоритмы "уровня детализации".
простой в реализации-разбить ваш том (поверхность) на некоторое количество подтомов. Из точек в каждом подтоме выберите репрезентативную точку (например, ближайшую к центру, или ближайшую к среднему, или среднюю и т. д.). используйте эти точки для перерисовки поверхности.
вы можете настроить количество подтомов, чтобы увеличить / уменьшить детали на лету.
Я бы подошел к этому, ища вершины (точки), которые мало способствуют кривизне поверхности. Найдите все стороны, выходящие из каждой вершины, и возьмите точечные произведения пар (?) из них. Точки, представляющие собой очень мелкие "холмы", будут иметь огромные углы (около 180 градусов) и небольшие точечные продукты.
эти вершины с наименьшими числами будут затем кандидатами на удаление. Вершины вокруг них образуют плоскость.
или что-то вроде того.
Google для Хьюза Хоппа и его работы по" реконструкции поверхности".
реконструкция поверхности используется для поиска сетчатой поверхности в соответствии с облаком точек; однако этот метод дает много треугольников. Затем можно применить метод сокращения сетки, чтобы уменьшить количество полигонов таким образом, чтобы минимизировать ошибку. В качестве примера вы можете посмотреть методы децимации OpenMesh.
существует несколько различных методов упрощения точечной модели поверхности, в том числе:
- кластеризации;
- моделирование частиц;
- итерационный упрощение.
посмотреть опрос:
М. Паули, М. Гросс и Л. П. Коббельт. Эффективное упрощение точки- образцы поверхностей. В материалах конференции по визуализации’02, страницы 163-170, Washington, DC, 2002. институт IEEE.
Если вы параметризовать поверхность каким-то образом я не уверен, как вы можете решить, какие очки носить подобную информацию (и таким образом можно выбросить).
Я думаю, вы можете выбрать кучу точек наугад, чтобы избавиться, но это не похоже на то, что вы хотите сделать.
возможно, точки рядом друг с другом (для некоторого определения "рядом") могут считаться содержащими аналогичную информацию и поэтому сводятся к отдельным представителям для каждого такого группа.
не могли бы вы рассказать подробнее?
проще упростить облако точек без ограничений треугольников и индексов сетки.
сглаживание и упрощение-это разные задачи. Чтобы упростить облако, вы должны сначала избавиться от шумовых артефактов, сделав профиль типа шума, который у вас есть, это частота и направленная карактеристика и сделать профиль шума по сравнению с уменьшением типа. для этого нужны хорошие нормальные векторы.
вот документ о 5-6 упрощение с использованием математики Делоне, вороного и k ближайших соседей:
http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.10.9640&rep=rep1&type=pdf
более поздняя версия с 2008 года: http://www.wseas.us/e-library/transactions/research/2008/30-705.pdf
вот недавняя версия c++ : https://github.com/tudelft3d/masbcpp/blob/master/src/simplify.cpp