У меня есть 3D-сетка, которая представляет поверхность с некоторыми грубыми границами, которые я хотел бы сгладить:
Я использую половинную структуру данных для хранения геометрии, чтобы я мог легко перебирать граничные ребра, вершины и грани. Я также могу довольно легко определить, является ли данная пара ребер выпуклой / вогнутой, используя точечное и перекрестное произведение.
Как лучше подходить для сглаживания краев, чтобы они образовывали сплошную кривую линию, а не резкий рисунок, видимый на снимках?
вычислить угол между двумя соседними гранями
Я называю это ada
как угол дельта абс. Если оно больше, чем порог, это означает, что эта точка является краем. Вы можете вычислить это как max
всех углов между всеми линиями края. В 2D это выглядит так:
в 3D в сетке более 2 линий на точку, поэтому вам нужно проверить все комбинации и выбрать самую большую
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)
это может быть применено повторяющееся
синие и красные точки — исходные точки, зеленые точки — сглаженные точки