2016-03-01 62 views
0

我想要做的是创建一个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三角剖分对其进行三角剖分。我所得到的是这样的:

Plot

正如你所看到的三角有点儿工作,但它填补了正弦波振幅之间的空间。有没有办法去除填充的间距?或者阻止它首先做到这一点?正弦波的两端看起来也不对,我不知道为什么。这是甚至是最好的方法来实现我想要做的?

解析为.vtk文件不应该出现问题,但我首先需要一个干净的结构。预先感谢任何帮助!

回答

0

最后,我得到了非常接近我想要的东西。如果有人对这个答案感兴趣:

不用点云方法,我用自己的Python挖掘VTK(这是一种学习的痛苦,但有很多功能)。

我的算法基本上是这样:

  1. 第一近似正弦波作为一个简单的三角波。
  2. 饲料波的x,y和z坐标为vtkPoints对象
  3. 使用vtkParametricSpline顺利拿到了一波
  4. vtkSplineFilter有过一波
  5. vtkTubeFilter的平整度控制,以创建一个卷行
  6. vtkTriangleFilter的啮合
  7. vtkSTLWriter
1

我不会重新发明轮子,自己做所有事情。而不是使用python-vtk和paraview(这是3D数据的后期处理应用程序)为您做三角测量。 “只需”创建点并在该应用程序中完成其余部分。

我不太了解3D打印,但我知道我对STL和VTK的公平分享。手动执行并且VTK库具有has some nice Python examples和专用STLWriter是一种痛苦。您只需要需要围绕VTK的工作流程以及它如何在内部管理事情。这就是paraview非常方便。它使您能够记录您在GUI中执行的操作并显示它们并在Python中显示它们。学习内部工作方式非常棒。

+0

感谢您的见解!我之前想过使用VTK,但是无法完全掌握如何创建我想要的几何图形。但是你基本上说的是,我创建点云的方式没问题,但三角测量可以更好地处理VTK? – Ian

+0

我没有深入研究过你的方法,说实话。但是我知道科学计算社区中有人使用VTK和paraview(它完全基于VTK)来可视化比您更大的数量级的点云,并且使用它比三角测量更复杂。我只是放弃它,因为它已经准备好被使用,并且不必重新实现轮子。如果它不起作用,你可以不管。三角测量在VTK中运行得非常好。也许你必须把点云分成不同的输入。 –

+0

好的,我会给VTK一个去。如果我取得进展,我会更新我的文章并将你的文章标记为答案。 – Ian