Алгоритм сглаживания ребер открытой трехмерной сетки

У меня есть трехмерная сетка, представляющая поверхность с некоторыми грубыми границами, которые я хотел бы сгладить:

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

Каким будет наилучший подход для сглаживания краев, поэтому они образуют сплошную, извилистую линию, а не резкую картину, замеченную на снимках?

1 ответ

  • вычислить угол между двумя соседними гранями

    Я называю это ada как абс треугольник. Если он больше, чем порог, это означает, что эта точка является краем. Вы можете вычислить его как max всех углов между всеми линиями ребер. В 2D он выглядит так:

    в 3D сетке больше двух строк на точку, поэтому вам нужно проверить все комбинации и выбрать самый большой

    ada=max(abs(acos(n(i).n(j)))

    где n(i),n(j) - нормальные векторы соседних граней, где i != j

  • идентифицировать проблемные зоны

    так что найдите точки, где ada > threshold и создайте список этих точек

  • отфильтровать этот список

    если эта точка слишком далеко от любого другого (distance>threshold), затем удалите ее из списка, чтобы сохранить геометрическую форму

  • гладкие точки

    вам нужно настроить этот шаг в соответствии с вашими потребностями, я бы сделал это:

    найдите группу точек в списке, которые находятся близко друг к другу и примените к ним какое-то среднее геометрическое или числовое:

    pnt(i)=0.5*pnt(i)+0.25*pnt(i-1)+0.25*pnt(i+1)

    это может быть применено к повторению

    Синие и красные точки - это исходные точки, зеленые точки - сглаженные точки.

licensed under cc by-sa 3.0 with attribution.