2016-03-01 82 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