Перемешивание трехмерной триангулированной поверхности для лучшего качества сетки - PullRequest
0 голосов
/ 12 июня 2018

Я использую марширующие кубы, чтобы извлечь двумерную поверхность из объема.В этом случае Gyroid.

import numpy as np
from numpy import sin, cos, pi
from skimage import measure
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

def gyroid(x, y, z, t):
    return cos(x)*sin(y) + cos(y)*sin(z) + cos(z)*sin(x) - t

lattice_param = 1.0
strut_param = 0.0
resolution = 31j

x, y, z = pi*np.mgrid[-1:1:resolution, -1:1:resolution, -1:1:resolution] * lattice_param
vol = gyroid(x, y, z, strut_param)

verts, faces = measure.marching_cubes(vol, 0, spacing=(0.1, 0.1, 0.1)) # , normals, values

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_trisurf(verts[:, 0], verts[:, 1], faces, verts[:, 2], cmap='ocean', lw=1)

enter image description here

Все это прекрасно работает, но качество сетки ужасает во многих местах.Я не могу запустить FEA на сетках, так как многие элементы / грани имеют близкую к нулю область или сильно искажены.

enter image description here

Есть ли способили пересмешивание заданных вершин и обеспечение определенных метрик элементного лица / фасета (таких как соотношение сторон) или принуждение марширующих кубов к таким вещам?

Меня не беспокоит перемещение вершин, если сетка является хорошим приближением.

Ответы [ 2 ]

0 голосов
/ 14 июня 2018

Один из вариантов может заключаться в том, чтобы «перегруппировать» вывод марширующих кубов, используя пакет с поверхностной сеткой.По сути, это означает, что триангуляция марширующих кубов будет служить начальным определением поверхности для повторной триангуляции.

Существует множество методов, которые можно использовать для этого.Несколько опций, которые могут быть полезны (все C++ / C реализации):

  • JIGSAW: ограничено , frontal-delaunay алгоритм ^^, который обычно строит очень качественные поверхностные триангуляции Делоне.Для показанного типа объекта я ожидаю, что он будет работать хорошо.Во включенных демонстрациях (предоставленных в MATLAB) несколько примеров касаются перестановки выходных маршевых кубов.
  • CGAL: подход ограниченный , уточнение Делоне , который также может создавать поверхностные триангуляции Делоне, но использует немного другой алгоритм дляJIGSAW, а также включает в себя CVT схемы оптимизации ячеек типа.
  • MMG: набор стратегий перекодировки / оптимизации (насколько я понимаю), которые можно использоватьчтобы преобразовать (и, следовательно, улучшить) исходную сетку с помощью итеративного применения локальных модификаций.

^^ Я автор JIGSAW, так что здесь в основном бесстыдное продвижение.

0 голосов
/ 13 июня 2018

Странные треугольники происходят из странных данных, а не из метода, используемого для триангуляции.

Я могу сказать, что триангуляция Делоне достигает наилучшего соотношения площадь треугольника / треугольник-периметр (наилучшее теоретическое соотношение - с равносторонними треугольниками).Но вы не можете использовать if для своей сетки, потому что триангуляция Делоне выводит выпуклую сетку.

У вас впереди трудная задача.Некоторые мысли:

  • Удалите дублирующиеся точки, прежде чем создавать меш.Это позволит избежать множества треугольников, близких к нулю.
  • Обнаружение тонких треугольников.Разделите их на более «правильные» треугольники.
  • Вы можете создать плотную регулярную сетку.Каждый z можно найти, проходя через сетку, пока вы не найдете треугольник, который содержит x,y координаты точки в сетке, а затем интерполирует z.Если у вас есть какая-то дополнительная информация, например, соседки или иерархия, поиск может быть выполнен быстрее, чем проверка каждого треугольника.Триангуляция сетки довольно проста.
...