Python SciPy空间Delaunay/ConvexHull混淆

Python SciPy空间Delaunay/ConvexHull混淆,python,3d,scipy,delaunay,convex-hull,Python,3d,Scipy,Delaunay,Convex Hull,我试图生成随机凸多面体。我生成一组随机的3D坐标,然后找到它们的凸包(到目前为止还不错) 然后我想我应该用Delaunay三角剖分来给我一个凸面外壳的三角剖分。这就是我的基本理解开始显现的地方 这是密码 import numpy as np from scipy.spatial import ConvexHull from scipy.spatial import Delaunay import matplotlib as mpl import matplotlib.pyplot as plt

我试图生成随机凸多面体。我生成一组随机的3D坐标,然后找到它们的凸包(到目前为止还不错)

然后我想我应该用Delaunay三角剖分来给我一个凸面外壳的三角剖分。这就是我的基本理解开始显现的地方

这是密码

import numpy as np
from scipy.spatial import ConvexHull
from scipy.spatial import Delaunay
import matplotlib as mpl
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# Generate random points & convex hull
points = np.random.rand(20,3)
hull = ConvexHull(points)

fig = plt.figure()
ax = fig.gca(projection = '3d')

# Plot hull's vertices
for vert in hull.vertices:    
    ax.scatter(points[vert,0], points[vert,1], zs=points[vert,2])#, 'ro')

# Calculate Delaunay triangulation & plot
tri = Delaunay(points[hull.vertices])
for simplex in tri.simplices:
    vert1 = [points[simplex[0],0], points[simplex[0],1], points[simplex[0],2]]
    vert2 = [points[simplex[1],0], points[simplex[1],1], points[simplex[1],2]]
    vert3 = [points[simplex[2],0], points[simplex[2],1], points[simplex[2],2]]
    vert4 = [points[simplex[3],0], points[simplex[3],1], points[simplex[3],2]]
    ax.plot([vert1[0], vert2[0]], [vert1[1], vert2[1]], zs = [vert1[2], vert2[2]])
    ax.plot([vert2[0], vert3[0]], [vert2[1], vert3[1]], zs = [vert2[2], vert3[2]])
    ax.plot([vert3[0], vert4[0]], [vert3[1], vert4[1]], zs = [vert3[2], vert4[2]])
    ax.plot([vert4[0], vert1[0]], [vert4[1], vert1[1]], zs = [vert4[2], vert1[2]])

plt.show()
有几件事与我有关,情节有时会漏掉船体上的点&这似乎是Delaunay四面体化,我想我不应该对此感到惊讶,但这不是我想要的

我想只对船体表面进行三角剖分,所以我猜是一个包含曲面面的单纯形?这可能吗

谢谢

B

编辑:在下面pv的启示性帖子之后,我对代码进行了如下修改

import numpy as np
import pylab as pl
import scipy as sp
from scipy.spatial import ConvexHull
from scipy.spatial.distance import euclidean
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d as a3

aspect = 0
while aspect == 0:

    # Generate random points & convex hull
    points = np.random.rand(20,3)
    hull = ConvexHull(points)

    # Check aspect ratios of surface facets
    aspectRatio = []
    for simplex in hull.simplices:
        a = euclidean(points[simplex[0],:], points[simplex[1],:])
        b = euclidean(points[simplex[1],:], points[simplex[2],:])
        c = euclidean(points[simplex[2],:], points[simplex[0],:])
        circRad = (a*b*c)/(np.sqrt((a+b+c)*(b+c-a)*(c+a-b)*(a+b-c)))
        inRad = 0.5*np.sqrt(((b+c-a)*(c+a-b)*(a+b-c))/(a+b+c))
        aspectRatio.append(inRad/circRad)

    # Threshold for minium allowable aspect raio of surface facets
    if np.amin(aspectRatio) > 0.3:
        aspect = 1

ax = a3.Axes3D(pl.figure())
facetCol = sp.rand(3) #[0.0, 1.0, 0.0]

# Plot hull's vertices
#for vert in hull.vertices:    
#    ax.scatter(points[vert,0], points[vert,1], zs=points[vert,2])

# Plot surface traingulation
for simplex in hull.simplices:
    vtx = [points[simplex[0],:], points[simplex[1],:], points[simplex[2],:]]
    tri = a3.art3d.Poly3DCollection([vtx], linewidths = 2, alpha = 0.8)
    tri.set_color(facetCol)
    tri.set_edgecolor('k')
    ax.add_collection3d(tri)

plt.axis('off')
plt.show()
现在一切都如我所愿。我添加了一个纵横比阈值,以确保更好的三角测量

有些事情:

  • 您将
    点[hull.vertices]
    作为Delaunay的参数,因此
    tri.simplies
    中的整数是指向
    点[hull.vertices]
    的索引,而不是指向
    点的索引,因此您最终绘制了错误的点
  • 四面体有6个脊,但您只绘制了4个脊
  • 如果您只需要对凸面外壳曲面进行三角剖分,可以使用
    hull.simplices

或者只是:

ax.plot_trisurf(points[:,0], points[:,1], points[:,2],
                triangles=hull.simplices)
有些事情:

  • 您将
    点[hull.vertices]
    作为Delaunay的参数,因此
    tri.simplies
    中的整数是指向
    点[hull.vertices]
    的索引,而不是指向
    点的索引,因此您最终绘制了错误的点
  • 四面体有6个脊,但您只绘制了4个脊
  • 如果您只需要对凸面外壳曲面进行三角剖分,可以使用
    hull.simplices

或者只是:

ax.plot_trisurf(points[:,0], points[:,1], points[:,2],
                triangles=hull.simplices)