Как исправить ребра, не связанные с манихоту, генерируемые алгоритмами генерации сетки сетки с двойным контуром / поверхPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как исправить ребра, не связанные с манихоту, генерируемые алгоритмами генерации сетки сетки с двойным контуром / поверх

Сообщение Anonymous »

Алгоритм двойного контурного / поверхностного сети (реализация 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»