Алгоритм двойного контурного /поверхностного сети (в частности, реализация VTK через метод Pyvista contour_labels < /code>) иногда генерирует сетки с неэманскими краями для конкретных сценариев. Мы пытались решить эту проблему без успеха и ищем информацию о том, была ли эта проблема уже решена или у кого-то есть советы о том, как это можно решить. Насколько я понимаю, край на поверхностной сетке в идеале должен подключаться только к 2 лицам. Тем не менее, края этой проблемы подключаются к 4 лицам. Это позволяет легко идентифицировать проблемные ребра программно. Сложно описать эту проблему словами, поэтому мы собрали набор GIF -файлов, демонстрирующих проблему ниже. src = "https://i.sstatic.net/alsdua8j.gif"/>

Question
Does anyone know of Какие-либо алгоритмы для решения этой конкретной проблемы с сеткой, не связанной с Manifold, где 4 лица могут поделиться одним преимуществом?import numpy as np
import trimesh
import pyvista as pv
def to_mesh(data: np.ndarray) -> trimesh.Trimesh:
# Convert a Numpy array to a mesh using Surface Nets from Pyvista/VTK
data: pv.ImageData = pv.wrap(data)
mesh = data.contour_labels(output_mesh_type="triangles", smoothing=False)
faces = mesh.faces.reshape((mesh.n_cells, 4))[:, 1:]
mesh = trimesh.Trimesh(mesh.points, faces)
mesh.fix_normals()
if mesh.volume < 0:
mesh.invert()
return mesh
# Create initial data
data = np.zeros((10, 10, 10))
data[2:-2, 2:-2, 2:-2] = 1
# Case 1 - simple extrusion
data[1, 4, 4] = 1
data[1, 5, 5] = 1
# Case 2 - simple indentation
data[-2, 3, 3] = 1
data[-2, 3, 4] = 1
data[-2, 4, 3] = 1
data[-2, 4, 4] = 1
data[-2, 5, 5] = 1
data[-2, 5, 6] = 1
data[-2, 6, 5] = 1
data[-2, 6, 6] = 1
data[-2, 4, 6] = 1
data[-2, 3, 6] = 1
data[-2, 3, 5] = 1
data[-2, 5, 3] = 1
data[-2, 6, 3] = 1
data[-2, 6, 4] = 1
# Case 3 - double extrusion
data[4, 4, 1] = 1
data[4, 4, 0] = 1
data[5, 5, 1] = 1
data[5, 5, 0] = 1
# Convert the data to a mesh and show it
mesh = to_mesh(data)
print(f"Volume: {mesh.volume}")
print(f"Watertight: {mesh.is_watertight}")
# mesh.export("test.stl")
mesh.show()
< /code>
Наше исследование < /h2>
У нас были некоторые внутренние сеансы мозгового штурма, чтобы попытаться придумать потенциальные решения для решения этой проблемы и придумали идею, описанную ниже, но боролись с ее развитием в реальную реализацию. />[*]Determine the upper vertex (outward facing)
- This is challenging and our best idea is to try one, check if the result creates a hole, and if it does, select the other
- Это также сложно, поскольку вам необходимо разделить вершины в правильном направлении (вдали друг от друга) < /li>
Одна идея для определения направления-:
Группа 4 лица, подключенные к неэманвому краю, основанную на том, являются ли их нормлистскими, выходящими на то, что они находятся в том, что они находятся в обращении с ними, не выходящими на то, что они находятся в том, что они находятся в результате. positions from each set of faces that are not on the non-manifold edge - Moving the vertices in this direction
Update each face that was connected to the original vertex to the closest new vertex
Take the average Положение вершины < /li>
Найдите более близкую новую вершину, чтобы соединить ее с < /li>
< /ol>
< /li>
< /ol>
Любые идеи будут оценены. Мы считаем, что алгоритм Surface Nets достаточно популярен и существует достаточно долго, чтобы эта проблема уже была решена, но изо всех сил пытается найти информацию на ней.
Подробнее здесь: https://stackoverflow.com/questions/797 ... rface-nets