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

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

Сообщение Anonymous »

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

Code
Below is a Фрагмент кода, который мы сгенерировали, который демонстрирует каждый случай неэманских ребра, который мы могли бы подумать о тестировании потенциальных решений.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
[*]Split the vertex into 2 slightly separated vertices (1e-8 or something)
  • Это также сложно, поскольку вам необходимо разделить вершины в правильном направлении (вдали друг от друга) < /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
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

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

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