Алгоритм упрощения 3d поверхности?

У меня есть набор 3d-точек, которые приближаются к поверхности. Каждый пункт, однако, подвержен некоторой ошибке. Кроме того, набор точек содержит намного больше точек, чем необходимо для представления подстилающей поверхности.

то, что я ищу, - это алгоритм создания нового (гораздо меньшего) набора точек, представляющих упрощенную, более гладкую версию поверхности (простите, что у вас нет лучшего определения, чем "упрощенная, более гладкая"). Подстилающей поверхности не математический, поэтому я не надеюсь, что набор данных будет соответствовать какой-то математической функции.

7 ответов


вместо того, чтобы рассматривать его как облако точек, я бы рекомендовал триангулировать сетку с помощью триангуляции Делоне:http://en.wikipedia.org/wiki/Delaunay_triangulation

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


Я думаю, вы ищете алгоритмы "уровня детализации".

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

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


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

эти вершины с наименьшими числами будут затем кандидатами на удаление. Вершины вокруг них образуют плоскость.

или что-то вроде того.


Google для Хьюза Хоппа и его работы по" реконструкции поверхности".

реконструкция поверхности используется для поиска сетчатой поверхности в соответствии с облаком точек; однако этот метод дает много треугольников. Затем можно применить метод сокращения сетки, чтобы уменьшить количество полигонов таким образом, чтобы минимизировать ошибку. В качестве примера вы можете посмотреть методы децимации OpenMesh.

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