我想要做的是創建一個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