最近需要实现一个计算非凸多边形面积的功能,需要输入是顺次排序的多边形顶点坐标,假设输入的多边形顶点是V={v0, v1, v2, …, vn-1},则多边形的边为E={<v0, v1>, <v1, v2>, <v2, v3>,...,<vn-2, vn-1>, <vn-1, v0>}。要求输出该多边形所围成的面积。

对于凸多边形来讲,比较容易操作,只需要选择一个点作为公共顶点,然后将这个选定的公共顶点与所有其他顶点相连,即可将这个凸多边形分割为n-2个三角形,求这些三角形的面积之和即可。这里n为多边形的顶点个数,这些三角形都有这个选定的点作为一个公共顶点。

而对于非凸多边形显然无法直接这样操作。这一篇文章给出了一种求解任意多边形当然包括非凸多边形面积的算法。他的做法是给每个三角形的面积值一个符号,其基本思想仍然是构造一个类似于凸多边形的情况(并不一定是凸多边形,只是类似),然后减去多余的面积。这个思路是不错的,但是他在接下来具体实现的时候做法并不高明。具体在计算每个三角形的面积的时候,使用的方法不太好,不仅时间复杂度高,并且当两条线比较靠近的时候,使用开方操作,可能会导致溢出而无法开根号。因此我在这里对原作者的实现方法进行了一些改进。

三角形带符号的面积,容易让人想起向量的叉乘,之前在Graham-Scan算法计算凸包的Python代码实现一文中也使用了向量的叉乘。向量的叉乘是带符号的,并且其绝对值为两个向量共起点时所构成的平行四边形的面积。而平行四边形的对角线将整个平行四边形分割成了两个全等的三角形,因而每个三角形的面积为整个平行四边形的一半。

具体的Python实现及测试代码如下:

import numpy as np"""计算多边形的面积,包括非凸多边形的情况,要求输入的顶点是按照逆时针顺序顺次排列的。所要求解面积的多边形即为这些顶点一个一个地相连而成E = {<v0, v1>, <v1, v2>, <v2, v3>,...,<vn-2, vn-1>, <vn-1, v0>}@author: sdu_brz@date: 2019/02/18
"""def coss_multi(v1, v2):"""计算两个向量的叉乘:param v1::param v2::return:"""return v1[0]*v2[1] - v1[1]*v2[0]def polygon_area(polygon):"""计算多边形的面积,支持非凸情况:param polygon: 多边形顶点,已经进行顺次逆时针排序:return: 该多边形的面积"""n = len(polygon)if n < 3:return 0vectors = np.zeros((n, 2))for i in range(0, n):vectors[i, :] = polygon[i, :] - polygon[0, :]area = 0for i in range(1, n):area = area + coss_multi(vectors[i-1, :], vectors[i, :]) / 2return areaif __name__ == "__main__":"""测试"""polygon1 = np.array([[0, 0],[1, 0],[1, 1],[0, 1]])print(polygon_area(polygon1))polygon2 = np.array([[0, 0],[5, 0],[5, 4],[4, 4],[4, 1],[1, 1],[1, 7],[0, 7]])print(polygon_area(polygon2))

如有不当之处,欢迎通过QQ进行深入交流,同时也欢迎通过微信打赏的方式对博主进行支持。

计算任意多边形面积的Python实现相关推荐

  1. python计算多边形的面积并保留两位小数_计算任意多边形面积的Python实现

    最近需要实现一个计算非凸多边形面积的功能,需要输入是顺次排序的多边形顶点坐标,假设输入的多边形顶点是V={v0, v1, v2, -, vn-1},则多边形的边为E={, , ,...,, }.要求输 ...

  2. vue+d3.js计算任意多边形面积

    效果图 代码 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF ...

  3. python计算任意多边形面积

    看了一些方法网上的资料,也自己倒腾了一些想法. 然后看到这个大神的博客(<计算任意多边形的面积>),我就服气了. 我把代码转换为python: # 计算任意多边形的面积,顶点按照顺时针或者 ...

  4. python计算多边形的面积并保留两位小数_Python计算任意多边形面积算法

    多边形面积求解的方法很多,其中比较多见的就是增加一个点P,然后分别连接多边形各个定点与P点,然后计算每个三角形的符号面积(面积有正负之分),求和就可以计算出面积. 鉴于上面的方法,我们也可以用另外一种 ...

  5. python计算图形面积的方法_Python计算任意多边形面积算法

    多边形面积求解的方法很多,其中比较多见的就是增加一个点P,然后分别连接多边形各个定点与P点,然后计算每个三角形的符号面积(面积有正负之分),求和就可以计算出面积. 鉴于上面的方法,我们也可以用另外一种 ...

  6. 【几何】计算任意多边形面积

      给定一系列有序的线段(比如按顺序给定每个线段的左端点坐标),求这些线段围成的多边形的面积,公式为:   任意一个点与顺序相邻两点组成的三角形面积之和   分为凸多边形和凹多边形分别证明: 一.凸多 ...

  7. Java计算任意多边形面积

    任意多边形的面积可由任意一点与多边形上依次两点连线构成的三角形矢量面积求和得出. 矢量面积=三角形两边矢量的叉乘.![在这里插入图片描述](https://img-blog.csdnimg.cn/ad ...

  8. 再说不会用python计算地球表面多边形面积,可不能了!(记录五种可行方法)

    由于地理投影导致导致每个像元实际地面面积不同,越靠近北极实际面积越小,越靠近赤道实际面积越大,如果不进行面积加权就简单平均,会导致温度较实际温度偏低. 直接使用卫星地图的计算面积功能就会遇到这样的问题 ...

  9. 凸多边形面积_C++计算任意多边形的面积

    任意多边形的面积计算_拾忆楓灵的博客-CSDN博客​blog.csdn.net 计算任意多边形的面积 - tenos - 博客园​www.cnblogs.com 完美解决计算3D空间任意多边形面积_S ...

最新文章

  1. A Crowdsourcing Method for Correcting Sequencing Errors for the Third-generation Sequencing Data 一种用
  2. 使用指针字符串查找字串的个数
  3. 网站SEO优化如何讨好搜索引擎蜘蛛?
  4. 【原创】自动更新程序2--更新程序的主窗体(技术:spring.net+三层架构+webservice+IrisSkin2换肤)...
  5. 使dreamweaver支持ftl扩展名
  6. Cocos2d-x--Box2D绘制出两个矩形框的解决方案
  7. 信安教程第二版-第26章大数据安全需求分析与安全保护工程
  8. 《XXX重大技术需求征集系统》的可用性和可修改性战术分析
  9. mysql 防重复提交_怎样防止刷新重复提交、防后退
  10. 递归查找特定路径的所有特定文件
  11. 串口与Modbus调试工具
  12. 计算机专业拼音怎样写,拼音汉字计算机输入方法
  13. 闲聊人工智能产品经理(AIPM)—人工智能产品经理的行业理解
  14. 恒大通关世界500强:一家房企的进阶路与中国民营企业的边界探索
  15. 移动应用专项测试的思路和方法
  16. GEF原理及实现系列(四、控制器)
  17. 使用snmpwalk采集设备的OID信息
  18. Parabolic SAR(抛物线转向指标)
  19. 怎么算程序框图的计算机程序,算法与程序框图导学案
  20. 大数据java篇——集合类

热门文章

  1. BDB(ICCV2019)
  2. tomcat国内下载地址
  3. 【亲测可行】error while loading shared libraries的解决方案
  4. Windows 7驱动开发系列(四)--WDM模型介绍
  5. DSP芯片倍频太大导致low power mode,无法连接JTAG
  6. python 机器学习——特征筛选实现
  7. 主管给实习生新人的一封邮件,字字珠玑,用心良苦
  8. linux探针,存活探针(Liveness)、就绪探针(Readiness)、启动探针(Startup)、容器钩子
  9. Python Excel插入图片
  10. Fedora 17 中文拼音输入法设置