我想用Delaunay算法对三维点云进行三角剖分。为了测试我的代码,我从STL文件中提取点云,然后尝试重新网格化它。这是我的代码:点云Delaunay三角剖分
import numpy as np
import matplotlib.pyplot as plt
from scipy.spatial import Delaunay
#--------------def funtion extract point cloud-------------------
def point_cloud(inp):
node = []
for line in inp:
temp1 = line.strip()
x = temp1.split()
if x[0] == "vertex":
del x[0]
node.append(x)
node = set(map(tuple,node))
return node
#--------------------end function---------------------------------
with open("D:\\cilinder.stl","r") as fo:
pc = point_cloud(fo)
u = []
v = []
w = []
for l in pc:
u.append(float(l[0]))
v.append(float(l[1]))
w.append(float(l[2]))
ua = np.array(u)
va = np.array(v)
#tri = mtri.Triangulation(u, v)
tri = Delaunay(np.array([u,v]).T)
points = []
vertex = []
for i in range(ua.shape[0]):
points.append([ua[i],va[i],w[i]])
for vert in tri.simplices:
#for vert in tri.triangles:
vertex.append(vert)
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection='3d')
ax.plot_trisurf(ua, va, w, triangles=tri.simplices, cmap=plt.cm.Spectral)
#ax.plot_trisurf(ua, va, w, triangles=tri.triangles, cmap=plt.cm.Spectral)
plt.show()
后,我运行此代码,我得到了以下结果:
结果:
该算法不三角的外表面点云。我无法弄清楚为什么我得到了这个结果。任何建议?
编辑:我刚刚发现,函数point_cloud提供了重复点,因为它们直接从STL文件中提取。
您是否想要生成三角形表面网格或四面体网格? –
三角形表面网格 – drSlump
好吧,问题很明显:那么只有给定一个点云,'Delaunay'无法知道哪个连接应该是所得形状的“外部”。它只是连接一些,导致你看起来有趣的东西。 –