Python中的凸包面积?

20

我有一组点 A。 我获取A的凸包CH_A

然后,我有额外的点,点集B。 我将B添加到A中,并获得一个更大的点集。 我得到包含AB的此更大集合的凸包CH_AB

我想量化将B添加到集合A中需要支付多少费用。 我考虑使用额外的面积来量化这个成本。

假设CH_A的面积为Area_A,那么CH_AB的面积为Area_AB。 那么,我想计算边际成本如下:

(Area_AB - Area_A) / Area_A 

如何在Python中获取凸包的面积?

2个回答

32
你可以直接使用scipy.spatial中的ConvexHull类。它不仅会给出凸包的面积,还会为您计算凸包。但是如果您使用它,请注意!在二维平面上,您要使用的属性不是area,而是volume,因为前者实际上将给出凸包的周长。
这是因为属性的命名是根据其在三维空间中的值命名的,其中area确实是凸包的面积,而volume则是其体积。对于二维凸包,名称相同,但它们实际包含的并不完全是所说的那样。更糟糕的是,文档没有警告您这一点。
(您可以通过简单的示例进行轻松检查,例如等腰直角三角形,其腿长为1:周长应为2+sqrt(2),约为3.414213562,面积应为0.5。)

18

凸包就是一个简单的凸多边形,因此您可以轻松地尝试{this}{this}来找到二维多边形的面积。

类似于以下内容(我们的版本):

def PolyArea2D(pts):
    lines = np.hstack([pts,np.roll(pts,-1,axis=0)])
    area = 0.5*abs(sum(x1*y2-x2*y1 for x1,y1,x2,y2 in lines))
    return area

其中 pts 是多边形顶点的数组,即大小为 (nx2) 的数组。

完整用法:

import numpy as np

def PolyArea2D(pts):
    lines = np.hstack([pts,np.roll(pts,-1,axis=0)])
    area = 0.5*abs(sum(x1*y2-x2*y1 for x1,y1,x2,y2 in lines))
    return area

pts = [[0,0],[1,0],[1,1],[0,1]]
print PolyArea2D(pts)    

pts = [[0,0],[1,0],[0,1]]
print PolyArea2D(pts)    

pts = [[0,0],[1,0],[0.5,0.5]] 
print PolyArea2D(pts)    

>>>
1.0
0.5
0.25

2
回答很清晰明了。不过有一个问题:函数名以大写字母开头! :-) - Juh_
如果我添加一个在更大的多边形内部的点,答案会改变。比如,pts = [[0,0],[1,0],[1,1],[0,1]] print PolyArea2D(pts) #1.0但是,pts = [[0,0],[1,0],[1,1],[0,1],[0.5,0.5]] print PolyArea2D(pts) #0.75 - Abhishek Reddy
我看到这个算法计算了一个多边形的面积,但是它在哪里计算了复杂外壳? - Pere

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接