Я пытаюсь создать трехмерную триангулированную сетку, которую можно преобразовать в файл .vtk или .stl для использования в приложении для 3D-печати. Прямо сейчас я застрял в создании треугольной сетки. Геометрия, которую я хочу создать, представляет собой трехмерные синусоидальные волны, которые имеют определенную толщину и пересекаются друг с другом. Пока у меня есть одна синусоида. Вот МВЕ:
import matplotlib.pyplot as plt
import numpy as np
from scipy import ndimage
import scipy.spatial
# create empty 3d array
array = np.zeros((100, 100, 100))
# create 3D sine wave in empty array
strut = np.sin(np.linspace(1, 10, 100))*12
for k in enumerate(strut):
y_shift = int(np.round(strut[k[0]]))
array[k, 50 + y_shift, 50] = 1
pattern = np.ones((4, 4, 4))
# convolve the array with the pattern / apply thickness
conv_array = ndimage.convolve(array, pattern)
# create list with data coordinates from convolved array
data = list()
for j in range(conv_array.shape[0]):
for k in range(conv_array.shape[1]):
for l in range(conv_array.shape[2]):
if conv_array[j, k, l] != 0:
data.append([j, k, l])
data = np.asarray(data)
tri = scipy.spatial.Delaunay(data)
fig = plt.figure()
ax = fig.add_subplot(111, projection="3d")
ax.hold(True)
ax.plot_trisurf(data[:, 0], data[:, 1], data[:, 2], triangles=tri.simplices)
plt.show()
Что он делает: я создаю пустой массив, который я заполняю синусоидой, представленной единицами. Я сворачиваю этот массив с прямоугольным массивом определенного размера, что дает мне более толстую синусоиду в пространстве. Затем массив преобразуется в координатную форму, чтобы его можно было триангулировать с помощью триангуляции Делоне. Я получаю следующее:
Как видите, триангуляция вроде бы сработала, но она заполняет пространство между амплитудами синусоиды. Есть ли способ удалить заполненный пробел? Или предотвратить это от их выполнения в первую очередь? Синусоида также выглядит неправильно на концах, и я не уверен, почему. Является ли это лучшим методом для достижения того, что я пытаюсь сделать?
Разбор файла .vtk не должен представлять проблем, но сначала мне нужна чистая структура. Заранее спасибо за любую помощь!