如何计算 python 中不规则形状的体积

how to calculate volume of irregular shapes in python

我有一个不规则的形状,想在 python 中计算它的体积。我看过 this solution,但我不知道如何在 python 中对其进行编码。我还上传了一张显示我的不规则盒子的图。黑线是平行的,图形是 3d 的。我将角的 8 个点的坐标作为 numpy 数组。

import numpy as np
corners = np.array([[0.,0.,0.], [0.,1.,0.1], [1.,1.,0.1], [0.,1.,0.], # lower rectangle
                    [0.,0.,1.], [0.,1.,1.1], [1.,1.,1.1], [0.,1.,1.]]# upper rectangle

对于这个简单的点,体积应该是 1 m^3 但实际上我的形状更不规则。如果有人能帮助我计算 python.

中此类形状的体积,我将非常感激

如果您的对象是凸面的,您可以借助 Delaunay 三角剖分.

将其拆分为四面体
import numpy as np
from scipy.spatial import Delaunay

corners = np.array([
    [0.,0.,0.], [0.,1.,0.1], [1.,1.,0.1], [0.,1.,0.], # lower rectangle
    [0.,0.,1.], [0.,1.,1.1], [1.,1.,1.1], [0.,1.,1.]  # upper rectangle
])

tri = Delaunay(corners)

这是 Delaunay 四面体:

>>> tetrahedra = corners[tri.simplices]
array([[[0. , 1. , 0. ],
        [0. , 1. , 0.1],
        [1. , 1. , 0.1],
        [0. , 0. , 0. ]],

       [[0. , 0. , 1. ],
        [0. , 1. , 0.1],
        [1. , 1. , 0.1],
        [0. , 0. , 0. ]],

       [[0. , 1. , 1. ],
        [0. , 0. , 1. ],
        [0. , 1. , 0.1],
        [1. , 1. , 0.1]],

       [[0. , 1. , 1. ],
        [0. , 0. , 1. ],
        [1. , 1. , 1.1],
        [1. , 1. , 0.1]],

       [[0. , 1. , 1. ],
        [0. , 0. , 1. ],
        [1. , 1. , 1.1],
        [0. , 1. , 1.1]]])

获得四面体体积的方法众所周知:

def volume_tetrahedron(tetrahedron):
    matrix = np.array([
        tetrahedron[0] - tetrahedron[3],
        tetrahedron[1] - tetrahedron[3],
        tetrahedron[2] - tetrahedron[3]
    ])
    return abs(np.linalg.det(matrix))/6

因此,计算 Delaunay 四面体的体积:

volumes = np.array([volume_tetrahedron(t) for t in tetrahedra])

求和:

>>> volume = np.sum(volumes)
0.5166666666666667

我坚持一点:你的物体必须是凸的。否则,Delaunay 算法会对对象的 凸包 进行三角剖分。