Python中的凸壳区域?

Sib*_*ing 9 python

对于downvoters:请说明原因.谢谢!

我有一套积分A.我得到的凸包CH_AA.

然后,我有额外的积分,点集B.我想补充BA,并获得更大的点集.我获得了CH_AB包含两个A和的这个更大的集合的凸包B.

我想量化我需要支付多少才能加入B套装A.我正在考虑使用额外的区域来量化这个成本.

CH_A有一个区域Area_A,然后CH_AB有一个区域Area_AB.然后,我想计算边际成本

(Area_AB - Area_A) / Area_A 
Run Code Online (Sandbox Code Playgroud)

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

Dev*_*per 11

凸壳只是一个凸多边形,因此您可以轻松地尝试{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
Run Code Online (Sandbox Code Playgroud)

其中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
Run Code Online (Sandbox Code Playgroud)

  • 很好而且清晰的答案。但有一个问题:函数名称以大写字母开头!:-) (2认同)

小智 10

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

那是因为属性以3D中的值命名,其中区域确实是船体的区域,体积,以及它的体积.对于2D船体,名称是相同的,但它们实际包含的内容并不完全与锡上所说的相同.更糟糕的是,文档并未就此发出警告.

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

https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.ConvexHull.html