Python中的凸包区域?

Python中的凸包区域?,python,geometry,convex-hull,Python,Geometry,Convex Hull,我有一组点a。我得到了A的凸壳chua 然后,我有额外的点,点集B。我将B添加到A中,得到一个更大的点集。我得到了这个更大集合的凸壳Chu AB,它包含A和B 我想量化将B添加到集合A中需要支付的金额。我正在考虑使用一个额外的区域来量化这一成本 假设Chu A的面积为area\u A,那么Chu AB的面积为area\u AB。然后,我想把边际成本计算为 (Area_AB - Area_A) / Area_A 如何在Python中获得凸包的面积?凸包只是一个凸多边形,因此您可以轻松尝试或查找

我有一组点
a
。我得到了
A
的凸壳
chua

然后,我有额外的点,点集
B
。我将
B
添加到
A
中,得到一个更大的点集。我得到了这个更大集合的凸壳
Chu AB
,它包含
A
B

我想量化将
B
添加到集合
A
中需要支付的金额。我正在考虑使用一个额外的区域来量化这一成本

假设
Chu A
的面积为
area\u A
,那么
Chu AB
的面积为
area\u AB
。然后,我想把边际成本计算为

(Area_AB - Area_A) / Area_A 

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

凸包只是一个凸多边形,因此您可以轻松尝试或查找二维多边形的面积

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

其中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
您可以使用来自的类。它不仅会给你船体的面积,还会为你计算船体。但是如果你真的使用它,小心在2D中,您要使用的属性不是
区域
,而是
体积
,因为前者实际上会给出船体的周长

这是因为属性在3D中是以它们的值命名的,其中
区域
实际上是船体的面积,
体积
,它的体积。对于2D外壳,名称是相同的,但它们实际包含的内容与锡上显示的内容不完全相同。更糟糕的是,文档没有警告您这一点


(你可以很容易地用一些简单的例子来验证这一点,比如腿上的等腰直角三角形长度为1:周长应该是2+sqrt(2),或者大约是3.414213562,面积应该是0.5。)

回答得很清楚。但有一个问题:函数名以大写开头!:-)如果我在更大的多边形内加一个点,答案就会改变。比如说,
pts=[[0,0]、[1,0]、[1,1]、[0,1]]print PolyArea2D(pts)#1.0
但是
pts=[[0,0]、[1,1]、[0,1]、[0.5,0.5]]print PolyArea2D(pts)#0.75
我看到这个算法计算给定多边形顶点的面积,但它在哪里计算复杂外壳呢?
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