【问题标题】:Area of polygon with list of (x,y) coordinates具有 (x,y) 坐标列表的多边形面积
【发布时间】:2016-04-27 19:04:01
【问题描述】:

考虑到过去在 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 函数后计算单元格的面积 - 不幸的是,该函数并不总是按以下顺序输出坐标将允许我计算正确的面积。

【问题讨论】:

  • 你,你在找convex hull
  • 感谢您的评论@tobias_k 我已经包含了一个编辑,它可以更好地解释我的问题。我正在阅读您的链接,以查看凸包是否是我的问题的准确描述。
  • 嗨@tobias_k 无论如何我可以利用我的清单来获得所需的区域吗?

标签: python list geometry


【解决方案1】:

可以从随机的坐标列表(取决于其顺序)创建多个不相交的多边形,每个多边形将具有不同的区域,因此您必须指定坐标的顺序来构建多边形(示例见附图)。

【讨论】:

  • 或者 OP 正在寻找凸包,即没有任何“凹痕”。
  • @tobias_k 基本上我是从一组坐标中制作 Voronoi 单元格。不幸的是,scipy Voronoi 函数没有以正确的顺序输出坐标。
  • 嗨@BlackAdder 我在我的原始帖子中包含了一个编辑,它更好地解释了这个问题。
【解决方案2】:

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

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

1) 通过增加横坐标对点进行排序;在平局的情况下,按纵坐标排序(这是字典顺序);

2) 考虑从第一个点到最后一个点的直线,并将点序列拆分为左右子序列(相对于线);

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

【讨论】:

  • 嗨@Yves,如果我根据您的程序使用我的列表,我可以使用 OP 中的代码来计算多边形的所需面积吗?
  • 我的意思是根据您的程序的第 1 步来处理我的列表。
  • @user2443944:当然,这个公式适用于所有多边形。但你需要这三个步骤。
  • 好吧,只是为了确保 - 如果我通过增加横坐标来恢复我的列表,那么我可以使用 OP 中的代码来获得 Voronoi 细胞案例所需的多边形区域吗?
  • @user2443944:没有。您需要这三个步骤。
猜你喜欢
  • 2014-08-19
  • 2021-12-05
  • 2020-03-05
  • 2018-02-19
  • 1970-01-01
  • 2013-09-20
  • 2012-09-20
  • 2013-12-20
相关资源
最近更新 更多