c++ - las - Algoritmo para suavizar los bordes de una malla 3D abierta
fallas de las impresoras 3d (1)
Tengo una malla 3D que representa una superficie con algunos límites ásperos que me gustaría suavizar:
Estoy usando una estructura de datos de medio borde para almacenar la geometría, así puedo iterar fácilmente sobre los bordes, vértices y caras de los límites. También puedo determinar con bastante facilidad si un par dado de bordes es convexo / cóncavo usando un producto de punto y cruz.
¿Cuál sería el mejor enfoque para alisar los bordes, de modo que formen una línea continua y curva, en lugar de un patrón nítido en las imágenes?
calcular el ángulo entre dos caras vecinas
Yo lo llamo
ada
como abs delta angle. Si es más grande que el umbral, significa que este punto es el borde. Puede calcularlo comomax
de todos los ángulos entre todas las líneas de borde. En 2D, se ve así:en malla 3D hay más de 2 líneas por punto, por lo que debe verificar todas las combinaciones y seleccionar la más grande
ada=max(abs(acos(n(i).n(j)))
donde
n(i),n(j)
son vectores normales de las caras vecinas dondei != j
identificar zonas problemáticas
para encontrar puntos donde
ada > threshold
y crear una lista de estos puntosfiltrar esta lista
si este punto está demasiado lejos de cualquier otro (
distance>threshold
), quítelo de la lista para conservar la forma geométricapuntos suaves
tienes que ajustar este paso para que coincida con tus necesidades. Haría esto:
busque un grupo de puntos en la lista que estén muy juntos y aplique algunos promedios geométricos o numéricos sobre ellos, por ejemplo:
pnt(i)=0.5*pnt(i)+0.25*pnt(i-1)+0.25*pnt(i+1)
esto se puede aplicar repetitivo
los puntos azules y rojos son puntos originales, los puntos verdes son puntos suavizados