我有这个问题。我尝试通过scipy.spatial.Delaunay对点云进行三角剖分。我用了:

tri = Delaunay(points) # points: np.array() of 3d points
indices = tri.simplices
vertices = points[indices]

但是,此代码返回四面体。仅怎么可能返回曲面三角形?

谢谢

最佳答案

为了使其像代码形式一样工作,您必须将表面参数化为2D。例如,在球(r,theta,psi)的情况下,半径是常数(将其丢弃),并且点数是2D(theta,psi)。

Scipy Delaunay是N维三角剖分,因此,如果给出3D点,它将返回3D对象。给它2D点,它返回2D对象。

下面是我用来为openSCAD创建多面体的脚本。 U和V是我的参数化(x和y),这是我给Delaunay的坐标。请注意,现在“Delaunay三角剖分属性”仅适用于u,v坐标(在uv -space中的角度最大化,而在xyz -space中的角度最大化),等等。

该示例是http://matplotlib.org/1.3.1/mpl_toolkits/mplot3d/tutorial.html的修改副本,该副本最初使用Triangulation函数(最终映射到Delaunay吗?)

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.tri as mtri
from scipy.spatial import Delaunay

# u, v are parameterisation variables
u = np.array([0,0,0.5,1,1])
v = np.array([0,1,0.5,0,1])

x = u
y = v
z = np.array([0,0,1,0,0])

# Triangulate parameter space to determine the triangles
#tri = mtri.Triangulation(u, v)
tri = Delaunay(np.array([u,v]).T)

print 'polyhedron(faces = ['
#for vert in tri.triangles:
for vert in tri.simplices:
    print '[%d,%d,%d],' % (vert[0],vert[1],vert[2]),
print '], points = ['
for i in range(x.shape[0]):
    print '[%f,%f,%f],' % (x[i], y[i], z[i]),
print ']);'


fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection='3d')

# The triangles in parameter space determine which x, y, z points are
# connected by an edge
#ax.plot_trisurf(x, y, z, triangles=tri.triangles, cmap=plt.cm.Spectral)
ax.plot_trisurf(x, y, z, triangles=tri.simplices, cmap=plt.cm.Spectral)


plt.show()

以下是(略微结构化的)文本输出:
polyhedron(
    faces = [[2,1,0], [3,2,0], [4,2,3], [2,4,1], ],

    points = [[0.000000,0.000000,0.000000],
              [0.000000,1.000000,0.000000],
              [0.500000,0.500000,1.000000],
              [1.000000,0.000000,0.000000],
              [1.000000,1.000000,0.000000], ]);

10-08 13:35