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

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

Сетка Граница 1 Граница сетки 2

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

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

6

Решение

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

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

    Ада 2D

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

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

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

  2. определить проблемные зоны

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

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

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

  4. гладкие точки

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

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

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

    это может быть применено повторяющееся

    сглаживающий

    синие и красные точки — исходные точки, зеленые точки — сглаженные точки

4

Другие решения


По вопросам рекламы [email protected]