我想要做的是创建一个3D三角网格,可以将其解析为.vtk或.stl文件以用于3D打印应用程序。现在我坚持创建三角形网格。我想要创建的几何基本上是三维正弦波,它们具有一定的厚度并相互交叉。到目前为止,我得到了一个正弦波。这里是一个MWE:从头开始创建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()
它做什么:我创建一个空数组,我用正弦波表示填充一个正弦波。我将这个阵列与一个规定尺寸的矩形阵列进行卷积,这给了我一个更大的正弦波。然后将数组转换为坐标形式,以便可以使用Delaunay三角剖分对其进行三角剖分。我所得到的是这样的:
正如你所看到的三角有点儿工作,但它填补了正弦波振幅之间的空间。有没有办法去除填充的间距?或者阻止它首先做到这一点?正弦波的两端看起来也不对,我不知道为什么。这是甚至是最好的方法来实现我想要做的?
解析为.vtk文件不应该出现问题,但我首先需要一个干净的结构。预先感谢任何帮助!
感谢您的见解!我之前想过使用VTK,但是无法完全掌握如何创建我想要的几何图形。但是你基本上说的是,我创建点云的方式没问题,但三角测量可以更好地处理VTK? – Ian
我没有深入研究过你的方法,说实话。但是我知道科学计算社区中有人使用VTK和paraview(它完全基于VTK)来可视化比您更大的数量级的点云,并且使用它比三角测量更复杂。我只是放弃它,因为它已经准备好被使用,并且不必重新实现轮子。如果它不起作用,你可以不管。三角测量在VTK中运行得非常好。也许你必须把点云分成不同的输入。 –
好的,我会给VTK一个去。如果我取得进展,我会更新我的文章并将你的文章标记为答案。 – Ian