Алгоритм двойного контурного / поверхностного сети (реализация VTK через метод Pyvista < / code> Метод) иногда генерирует сетки с ребрами без допуска. Я ищу совета о том, как это можно решить. Край на поверхностной сетке должен подключаться только к 2 лицам. Тем не менее, края этой проблемы подключаются к 4 лицам. Это позволяет легко идентифицировать проблемные ребра программно. />
Это не проблема со многими операциями, такими как вычисление громкости. Тем не менее, некоторые другие операции не работают с этими краями, не относящимися к Manifold. Например, я использовал сглаживание лапласиана (от Trimesh.smoothing) на сетках, которые содержали эти проблемы, и создает острые шипы, происходящие из этих неманнообразных краев. Тримеш сообщает, что эти сетки не имеют водонепроницаемости. src = "https://i.sstatic.net/k0beeqgy.gif"/>
Какие алгоритмы решают эту проблему без Manifold, где 4 лица могут поделиться одним краем? Код, который демонстрирует каждый случай неэманских ребра для тестирования потенциальных решений на: < /p>
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>
Я придумал идею ниже, но боролся с реализацией. < /p>
Определите края необработанных (ребра, разделяемые 4 лица). < /li>
Определить верхний вертекс (внешняя сторона). Если это так, выберите другой. < /li>
< /ol>
< /li>
Разделите вершину на 2 отдельные вершины (1E-8 или что-то в этом роде).
Вам нужно разделить вершины в правильном направлении (вдали друг от друга). />
Группируйте 4 лица, связанные с неэманским преимуществом, основанным на том, являются ли их нормали перпендикулярно и обращаются друг от друга. /> < /li>
< /ol>
< /li>
Обновите каждую лицо, которая была подключена к исходной вершине к ближайшей новой вершине.
Возьмите среднее положение вершины. /> < /ol>
Я чувствую, что проблема алгоритма поверхностных сетей, возможно, уже решена, но не знаю, как. < /p>
Подробнее здесь: https://stackoverflow.com/questions/797 ... rface-nets
Как исправить ребра, не связанные с манихоту, генерируемые алгоритмами генерации сетки сетки с двойным контуром / поверх ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как исправить неправочные края, генерируемые алгоритмом генерации сетки Surface Nets?
Anonymous » » в форуме Python - 0 Ответы
- 3 Просмотры
-
Последнее сообщение Anonymous
-