对于downvoters:请说明原因.谢谢!
我有一套积分A.我得到的凸包CH_A的A.
然后,我有额外的积分,点集B.我想补充B到A,并获得更大的点集.我获得了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)
小智 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