我有一套点A
。我得到的凸包CH_A
。A
然后,我有加分,点集B
。我添加B
并A
获得更大的点集。CH_AB
我获得了包含A
和的更大集合的凸包B
。
我想量化我需要支付多少才能添加B
到 setA
中。我正在考虑使用一个额外的区域来量化这个成本。
说CH_A
有一个面积Area_A
,那么CH_AB
有一个面积Area_AB
。然后,我想计算边际成本为
(Area_AB - Area_A) / Area_A
如何在 Python 中获得凸包的面积?
我有一套点A
。我得到的凸包CH_A
。A
然后,我有加分,点集B
。我添加B
并A
获得更大的点集。CH_AB
我获得了包含A
和的更大集合的凸包B
。
我想量化我需要支付多少才能添加B
到 setA
中。我正在考虑使用一个额外的区域来量化这个成本。
说CH_A
有一个面积Area_A
,那么CH_AB
有一个面积Area_AB
。然后,我想计算边际成本为
(Area_AB - Area_A) / Area_A
如何在 Python 中获得凸包的面积?
您可以只ConvexHull
使用scipy.spatial
. 它不仅会为您提供船体的面积,还会为您计算船体。但是,如果您确实使用它,请注意!在 2D 中,您要使用的属性不是area
,而是volume
,因为前者实际上会给您船体的周长。
那是因为属性是根据它们在 3D 中的值命名的,其中area
确实是船体的面积,volume
以及它的体积。对于 2D 船体,名称是相同的,但它们实际包含的内容并不像锡上所说的那样。更糟糕的是,文档并没有就此向您发出警告。
(您可以通过简单的示例轻松检查这一点,例如腿上长度为 1 的等腰直角三角形:周长应为 2+sqrt(2),或大约为 3.414213562,面积应为 0.5。)
凸包只是一个凸多边形,因此您可以轻松尝试{this}或{this}来查找 2D 多边形的面积。
类似于以下内容(我们的版本):
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