16

我有一套点A。我得到的凸包CH_AA

然后,我有加分,点集B。我添加BA获得更大的点集。CH_AB我获得了包含A和的更大集合的凸包B

我想量化我需要支付多少才能添加B到 setA中。我正在考虑使用一个额外的区域来量化这个成本。

CH_A有一个面积Area_A,那么CH_AB有一个面积Area_AB。然后,我想计算边际成本为

(Area_AB - Area_A) / Area_A 

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

4

2 回答 2

28

您可以只ConvexHull使用scipy.spatial. 它不仅会为您提供船体的面积,还会为您计算船体。但是,如果您确实使用它,请注意!在 2D 中,您要使用的属性不是area,而是volume,因为前者实际上会给您船体的周长。

那是因为属性是根据它们在 3D 中的值命名的,其中area确实是船体的面积,volume以及它的体积。对于 2D 船体,名称是相同的,但它们实际包含的内容并不像锡上所说的那样。更糟糕的是,文档并没有就此向您发出警告。

(您可以通过简单的示例轻松检查这一点,例如腿上长度为 1 的等腰直角三角形:周长应为 2+sqrt(2),或大约为 3.414213562,面积应为 0.5。)

于 2017-09-15T20:17:23.980 回答
16

凸包只是一个凸多边形,因此您可以轻松尝试{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
于 2013-11-09T11:37:38.930 回答