【问题标题】:Calculate the volume of a 3D polyhedron with Python?用 Python 计算 3D 多面体的体积?
【发布时间】:2013-06-12 07:41:34
【问题描述】:

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

多面体示例

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

【问题讨论】:

  • 您可能会发现this 有帮助
  • 您是否需要由一组复杂的 3D 顶点和基于它们的面给出的任何多面体的体积?或者,正如您的图形似乎显示的那样,您只需要平面z=0z=f(x,y) 定义的表面之间的体积?
  • 后者就足够了,但我肯定会对通用解决方案感兴趣。
  • @ali_m 我确实很早就发现了,但希望已经实现了一些东西;不过,如果没有时间,我会在找到时间时写一些东西。该解决方案是否特定于该多面体,或者可能适用于任何一个,如上所示?谢谢。
  • @shootingstars 我不知道任何现有的 Python 实现,但我为您链接的方法应该推广到任何多面体。还有其他方法 - 例如参见here

标签: python spatial


【解决方案1】:

您的多边形是否可以在内部找到一个点,这样您就可以将每个顶点连接到该点而不与面相交?如果是这样,您可以将每个面细分为三角形。您可以通过将面的一个顶点作为枢轴点并从其他顶点绘制线到枢轴顶点来轻松完成此操作。例如,一个五边形被分成三个三角形,这些三角形从一个共同的顶点形成扇形。每个三角形将形成一个四面体(一个 3 面金字塔),其中的点。然后,您可以将每个面的所有四面体的体积相加。以下是围绕原点 (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.

【讨论】:

  • 我希望用它来计算一个水盆(如海湾)的体积,我有一堆图表深度。既然如此,我不明白为什么我不能在中深度的盆地中心随便选一个点来做这个,对吧?我已经完成了一些事情,但会尽快尝试。谢谢!
  • 从技术上讲,在拓扑学科中,如果我没记错的话,这就是星形体和凸体之间的区别问题。星形体是一个体积,其中存在某个点,从该体积中的所有点都可以用一条完全在体内的线连接起来。凸体是一种特殊情况,凸体中的每个点都是这样的点。如果情况是星形体,问题是要找到这样一个中心点,而如果情况是凸体,任何点,例如任何一个顶点,都可以作为中心点。
【解决方案2】:

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

    import numpy as np
    from scipy.spatial import ConvexHull

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

此外,使用 Delaunay 模块,您可以将通过的点三角剖分为四面体以获取其他内容..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 2014-10-18
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    • 2023-02-09
    相关资源
    最近更新 更多