带有(x,y)坐标列表的多边形区域

时间:2016-01-21 13:38:29

标签: python list geometry

考虑到过去在stackoverflow中提供了解决方案,我要求python代码计算带有(x,y)坐标列表的多边形区域,这似乎有点奇怪。但是,我发现所提供的所有解决方案都对给定的(x,y)坐标列表的顺序很敏感。例如,使用下面的代码查找多边形的区域:

def area(p):
    return 0.5 * abs(sum(x0*y1 - x1*y0
                             for ((x0, y0), (x1, y1)) in segments(p)))

def segments(p):
    return zip(p, p[1:] + [p[0]])


coordinates1 = [(0.5,0.5), (1.5,0.5), (0.5,1.5), (1.5,1.5)]
coordinates2 = [(0.5,0.5), (1.5,0.5), (1.5,1.5), (0.5,1.5)]

print "coordinates1", area(coordinates1)
print "coordinates2", area(coordinates2)

返回

coordinates1 0.0
coordinates2 1.0  #This is the correct area

对于同一组坐标但具有不同的顺序。我如何纠正这个问题,以便得到不相交的完整多边形的区域,其中包含我想要制作成非交叉多边形的随机(x,y)坐标列表?

编辑:我现在意识到可以有一组来自一组坐标的非交叉多边形。基本上我使用scipy.spatial.Voronoi来创建Voronoi单元格,并且我希望在将坐标输入scipy Voronoi函数后计算单元格的面积 - 遗憾的是,函数并不总是输出坐标按顺序允许我计算正确的区域。

2 个答案:

答案 0 :(得分:5)

可以从随机坐标列表(取决于其顺序)创建几个非相交的多边形,并且每个多边形将具有不同的区域,因此必须指定构建多边形的坐标的顺序(参见附图以获得一个例子)。 This two polygons have the same coordinates but different area

答案 1 :(得分:2)

Voronoi单元格是凸的,因此多边形是明确定义的。

您可以计算点的凸包,但由于没有要移除的反射顶点,因此过程更简单。

1)通过增加横坐标对点进行排序;如果是关系,则按纵坐标排序(这是字典顺序);

2)考虑从第一个点到最后一个点的直线,并在左子句和右子序列中分割点序列(相对于线);

3)请求的多边形是左子序列和右子序列的串联,反转。

enter image description here