如何计算 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 算法会对对象的 凸包 进行三角剖分。
我有一个不规则的形状,想在 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 算法会对对象的 凸包 进行三角剖分。