从头开始创建三维三角网格

2024-09-27 02:17:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我要做的是创建一个三维三角网格,它可以被解析成一个.vtk或.stl文件,用于三维打印应用程序。现在我正忙于创建三角形网格。我要创建的几何体基本上是三维正弦波,它们有一定的厚度,并且彼此相交。到目前为止我只有一个正弦波。以下是MWE:

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()

它的作用:我创建一个空数组,用1表示的正弦波填充它。我用一个指定大小的矩形数组来卷积这个数组,这给了我一个更厚的空间正弦波。然后将数组转换为坐标形式,这样就可以使用Delaunay三角剖分对其进行三角化。我得到的是:

Plot

如你所见,三角剖分有点奏效,但它填补了正弦波振幅之间的空间。有没有办法去掉填充的空格?还是先阻止他们?正弦波的末端看起来也不对,我不知道为什么。这就是我想要的最好的方法吗?在

对.vtk文件的解析应该不会出现问题,但我首先需要一个干净的结构。提前感谢您的帮助!在


Tags: inimportfordatacreatenprangeplt
2条回答

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

我没有采用点云方法,而是深入研究了python的VTK(这是一个很难学习的问题,但是有很多功能)。在

我的算法基本上是这样的:

  1. 先将正弦波近似为一个简单的三角波。在
  2. 将波的x、y和z坐标输入vtkPoints对象
  3. 使用vtkParametricsLine可以获得平滑波
  4. vtkSplineFilter可控制波浪的平滑度
  5. vtkTubeFilter从该行创建卷
  6. 用于啮合的VTK三角形滤波器
  7. vtkSTLWriter

我不会重新发明轮子,独自完成所有这些。而不是使用python vtk和paraview(这是一个三维数据的后处理应用程序)来为您进行三角剖分。”只需“创建点,然后在该应用程序中执行其余操作。在

我对3D打印了解不多,但我知道我对STL和VTK的看法。手工操作很痛苦,VTK库有has some nice Python examples和一个专用的STLWriter。你只需要把你的脑袋放在VTK的工作流程上,以及它是如何管理内部事务的。这就是paraview派上用场的地方。它使您能够记录在GUI中执行的操作,并在Python中显示它们。学习它内部的工作方式是很好的。在

相关问题 更多 >

    热门问题