使用Python计算3D多面体的体积?

时间:2013-06-16 00:16:55

标签: python spatial

我试图找出用Python计算3D多面体体积的最佳方法,我希望有一个简单的解决方案,我似乎找不到。

多面体示例 Example Polyhedron

我确实发现this post描述了计算3D空间中平面多边形的面积,但这似乎没有帮助。

2 个答案:

答案 0 :(得分:2)

如果您只有凸多面体,则可以使用scipy.spatial.ConvexHull的QHull绑定。

    import numpy as np
    from scipy.spatial import Convexhull

    points = np.array([[....]])  # your points
    volume = Convexhull(points).volume

此外,模块Delaunay可以将您传递的点三角测量为四面体以用于其他东西..

答案 1 :(得分:1)

您的多边形是否可以在内部找到一个点,以便您可以将每个顶点连接到该点而不会穿过面?如果是这样,您可以将每个面细分为三角形。您可以通过让面的一个顶点成为枢轴点并从其他顶点绘制线到枢轴顶点来轻松完成此操作。例如,五边形被分成三个三角形,从共同的顶点扇形展开。每个三角形将形成一个四面体(一个三面金字塔),内部有一个点。然后,您可以为每个面添加所有四面体的体积。以下是围绕原点的凸多面体(x = 0,y = 0,z = 0)。它假设有一个面部列表f,每个面都有一个顶点列表v。

def volume(self):
  ''' calculate volume of polyhedron '''
  vol = 0.
  for f in self.f: # the faces
    n = len(f.v)
    v2 = f.v[0] # the pivot of the fan
    x2 = v2.x
    y2 = v2.y
    z2 = v2.z
    for i in range(1,n-1): # divide into triangular fan segments
      v0 = f.v[i]
      x0 = v0.x
      y0 = v0.y
      z0 = v0.z
      v1 = f.v[i+1]
      x1 = v1.x
      y1 = v1.y
      z1 = v1.z
      # Add volume of tetrahedron formed by triangle and origin
      vol += math.fabs(x0 * y1 * z2 + x1 * y2 * z0 \
                     + x2 * y0 * z1 - x0 * y2 * z1 \
                    - x1 * y0 * z2 - x2 * y1 * z0)
 return vol/6.