Python中的凸包区域?

Posted

技术标签:

【中文标题】Python中的凸包区域?【英文标题】:Convex hull area in Python? 【发布时间】:2013-11-21 07:42:27 【问题描述】:

我有一组点A。我得到了CH_A 的凸包A

那么,我有加分,点集B。我将B 添加到A 并获得更大的点集。我获得了包含AB 的更大集合的凸包CH_AB

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

假设CH_A 的面积为Area_A,那么CH_AB 的面积为Area_AB。然后,我想计算边际成本为

(Area_AB - Area_A) / Area_A 

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

【问题讨论】:

【参考方案1】:

您可以只使用来自scipy.spatialConvexHull 类。它不仅会为您提供船体的面积,还会为您计算船体。但是如果你确实使用它,小心!在 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.0pts = [[0,0],[1,0],[1,1],[0,1],[0.5,0.5]] print PolyArea2D(pts) #0.75 我看到这个算法在给定顶点的情况下计算多边形的面积,但是它在哪里计算复杂的外壳?

以上是关于Python中的凸包区域?的主要内容,如果未能解决你的问题,请参考以下文章

python数字图像处理(18):高级形态学处理

用 R 点云覆盖的区域

poj1259The Picnic & hdu6219 Empty Convex Polygon(17沈阳区域赛C)最大空凸包

csu 1812: 三角形和矩形 凸包

计算几何中的凸包类问题

凸包中的额外点(使用格雷厄姆扫描)错误+ java