Python中的凸包区域?
Posted
技术标签:
【中文标题】Python中的凸包区域?【英文标题】:Convex hull area in Python? 【发布时间】:2013-11-21 07:42:27 【问题描述】:我有一组点A
。我得到了CH_A
的凸包A
。
那么,我有加分,点集B
。我将B
添加到A
并获得更大的点集。我获得了包含A
和B
的更大集合的凸包CH_AB
。
我想量化将B
添加到集合A
中需要支付多少费用。我正在考虑使用一个额外的区域来量化这个成本。
假设CH_A
的面积为Area_A
,那么CH_AB
的面积为Area_AB
。然后,我想计算边际成本为
(Area_AB - Area_A) / Area_A
如何在 Python 中获得凸包的面积?
【问题讨论】:
【参考方案1】:您可以只使用来自scipy.spatial
的ConvexHull
类。它不仅会为您提供船体的面积,还会为您计算船体。但是如果你确实使用它,小心!在 2D 中,你要使用的属性不是 area
,而是 volume
,因为前者实际上会给你船体的周长。
这是因为属性是根据它们在 3D 中的值命名的,其中 area
确实是船体的面积,而 volume
就是它的体积。对于 2D 船体,名称相同,但它们实际包含的内容与锡上所说的不完全一样。更糟糕的是,文档并没有就此发出警告。
(您可以通过简单的示例轻松检查这一点,例如腿上长度为 1 的等腰直角三角形:周长应为 2+sqrt(2),或约 3.414213562,面积应为 0.5。)
【讨论】:
【参考方案2】:凸包只是一个凸多边形,因此您可以轻松尝试this 或this 来查找二维多边形的面积。
类似于以下内容(我们的版本):
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
【讨论】:
不错且清晰的答案。但是有一个问题:函数名以大写开头! :-) 如果我在更大的多边形内添加一个点,答案会改变。比如说pts = [[0,0],[1,0],[1,1],[0,1]] print PolyArea2D(pts) #1.0
但pts = [[0,0],[1,0],[1,1],[0,1],[0.5,0.5]] print PolyArea2D(pts) #0.75
我看到这个算法在给定顶点的情况下计算多边形的面积,但是它在哪里计算复杂的外壳?以上是关于Python中的凸包区域?的主要内容,如果未能解决你的问题,请参考以下文章
poj1259The Picnic & hdu6219 Empty Convex Polygon(17沈阳区域赛C)最大空凸包