【计算几何】给定一组点的多边形面积

目录

  • 一、说明
  • 二、有序顶点集
  • 三、无序顶点集
    • 3.1 凸多边形
    • 3.2 非凸多边形
  • 四、结论

一、说明

   计算多边形面积的方法有很多种。众所周知的多边形(如三角形、矩形、正方形、梯形等)的面积可以使用简单的数学公式计算。在这篇文章中,我将讨论如何计算给定顶点集的多边形面积。这里讨论的方法适用于大多数没有孔的多边形。

二、有序顶点集

   如果多边形的顶点按顺时针或逆时针方向排列,则可以使用鞋带算法计算面积。该公式可以用表达式表示


A = 1 2 ∣ ∑ i = 1 n − 1 x i y i + 1 + x n y 1 − ∑ i = 1 n − 1 x i + 1 y i − x 1 y n ∣ A = \frac{1}{2}\left|\sum_{i = 1}^{n-1}x_iy_{i+1}+x_ny_1 - \sum_{i = 1}^{n - 1}x_{i + 1}y_i - x_1y_n\right| A=21 i=1n1xiyi+1+xny1i=1n1xi+1yix1yn

   使用此公式的唯一条件是顶点必须按顺时针或逆时针方向排序,否则面积将不正确。这是该算法的Python实现。

# Shoelace formula to calculate the area of a polygon
# the points must be sorted anticlockwise (or clockwise)def polygon_area(vertices):psum = 0nsum = 0for i in range(len(vertices)):sindex = (i + 1) % len(vertices)prod = vertices[i].x * vertices[sindex].ypsum += prodfor i in range(len(vertices)):sindex = (i + 1) % len(vertices)prod = vertices[sindex].x * vertices[i].ynsum += prodreturn abs(1/2*(psum - nsum))

   列表顶点包含 Point 类型的对象列表。点是表示 2D 平面中的点的数据结构。表示一个点的Python代码是

class Point:def __init__(self, x, y):self.x = xself.y = ydef __str__(self):return '(' + str(self.x) + ', ' + str(self.y) + ')'

   下面的代码片段测试了上面的代码。

if __name__ == '__main__':points = [Point(0, 0), Point(5, 0), Point(5, 5), Point(0, 5)]print polygon_area(points) # prints 25

三、无序顶点集

   如果顶点不是顺时针或逆时针排列的,那么计算面积可能会有点棘手。这意味着,在调用 之前,我们需要按顺时针或逆时针polygon_area(points)排序。points为了对顶点进行排序,我们需要一个完全位于多边形内部的参考点。有了参考点后,我们计算参考点与每个顶点之间的角度,并按升序或降序对它们进行排序。现在的问题是,我们如何找到参考点呢?答案很简单“这取决于多边形的类型”。

3.1 凸多边形

   如果多边形是凸多边形,即所有内角都小于或等于的多边形18001800,多边形内的任何点都可以是给出完全相同面积的参考点,即无论参考点位于多边形内的哪个位置,面积在所有情况下都是相同的。这是因为参考点的选择不会改变凸多边形的形状。在这种情况下,我们可以简单地平均X 和y 坐标来找到参考点。这可以很容易地计算出来,如下面的代码所示。

# returns the average x and y coordinates of all the points
def average_point_inside(points):x = 0y = 0for point in points:x += point.xy += point.yreturn Point(x / len(points), y / len(points))

3.2 非凸多边形

   对于非凸多边形,参考点的选择会改变多边形的形状,因此不同的参考点可能会得到不同的面积。因此,如果多边形不是凸多边形,那么在顶点未排序的情况下求面积没有任何意义。

   一旦我们有了参考点(仅对凸多边形有意义),我们就可以根据参考点与每个顶点与 x 轴逆时针方向连接的线段所成的角度对所有顶点进行排序如下图所示,下面的代码计算参考点和顶点与x轴的连线之间的角度(以弧度为单位)。
在这里插入图片描述

# returns the angle made by a line segment
# connecting p1 and p2 with x-axis in the anticlockwise direction
def angle(p1, p2):k = (p2.y - p1.y) / distance(p1, p2)x2 = p2.xx1 = p1.xif k >= 0:if x2 >= x1: # First Quadrantreturn (2.0 * math.pi - math.asin(k))else: # Second Quadrantreturn (math.pi + math.asin(k))else:if x2 >= x1: # Fourth Quadrantreturn math.asin(-k)else: # Third Quadrantreturn (math.pi - math.asin(-k))

   sorted我们可以使用标准Python库的方法对顶点进行排序。这里的技巧是我们传递根据角度比较点的比较器。

# angularly sort the points anticlockwise
def sort_angular(points, reference_point):return sorted(points, key = lambda point: -angle(point, reference_point))

   现在我们完成了。我们将排序后的点传递到polygon_area给出正确面积的函数中。下面的代码片段测试了上面的代码。

if __name__ == '__main__':points = [Point(0,3), Point(2, 4), Point(3,1), Point(4,3), Point(3, 5), Point(1, 1)]reference_point = average_point_inside(points)spoints =  sort_angular(points, reference_point)print polygon_area(spoints) # prints 9

四、结论

   在这篇文章中,我讨论了如何计算给定一组顶点的面积。如果顶点是有序的,则可以使用鞋带公式计算面积。如果顶点没有排序,则将顶点排序后即可计算面积,只有多边形是凸多边形时才是准确的。如果多边形不是凸的,则该方法可能有效,也可能无效。最后,提供了实现所讨论的所有方法的 python 代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/677806.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vulnhub靶机:hacksudo-search

一、介绍 运行环境:Virtualbox 攻击机:kali(10.0.2.15) 靶机:hacksudo-search(10.0.2.50) 目标:获取靶机root权限和flag 靶机下载地址:https://download.vulnhub.co…

寒假作业2024.2.6

1.现有无序序列数组为23,24,12,5,33,5347&#xff0c;请使用以下排序实现编程 函数1:请使用冒泡排序实现升序排序 函数2:请使用简单选择排序实现升序排序 函数3:请使用直接插入排序实现升序排序 函数4:请使用插入排序实现升序排序 #include <stdio.h> #include <stdl…

算法学习——LeetCode力扣二叉树篇1

算法学习——LeetCode力扣二叉树篇1 144. 二叉树的前序遍历 144. 二叉树的前序遍历 - 力扣&#xff08;LeetCode&#xff09; 描述 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&a…

3D裸眼技术行业研究:2026年市场投资规模为10.78亿元

3D裸眼技术大多处于研发阶段&#xff0c;它的研发分两个方向&#xff0c;一是硬件设备的研发&#xff0c;二为显示内容的处理研发。第二种已经开始小范围的商业运用。大众消费者接触的不多。从技术上来看&#xff0c;3D裸眼可分为光屏障式(Barrier)、柱状透镜(Lenticular Lens)…

【第六天】c++虚函数多态

一、多态的概述 多态按字面的意思就是多种形态。当类之间存在层次结构&#xff0c;并且类之间是通过继承关联&#xff08;父类与子类&#xff09;时&#xff0c;就会用到多态。 C 多态意味着调用成员函数时&#xff0c;会根据调用函数的对象的类型来执行不同的函数。 静态多态&…

七、热身仪式(Warm-Up Rituals)

5.Warm Up Rituals 五、热身仪式 A warm up ritual is your per flight checklist you go through before you start focusing for a big session.It may be checking that you have water, that you don’t need to use the bathroom, that your phone is turned off or you’…

区间dp 笔记

区间dp一般是先枚举区间长度&#xff0c;再枚举左端点&#xff0c;再枚举分界点&#xff0c;时间复杂度为 环形石子合并 将 n 堆石子绕圆形操场排放&#xff0c;现要将石子有序地合并成一堆。 规定每次只能选相邻的两堆合并成新的一堆&#xff0c;并将新的一堆的石子数记做该…

C#实现矩阵乘法

目录 一、使用的方法 1.矩阵 2.矩阵的乘法原理 二、实例 1.源码 2.生成效果 一、使用的方法 矩阵相当于一个数组&#xff0c;主要用来存储一系列数&#xff0c;例如&#xff0c;mn矩阵是排列在m行和n列中的一系列数&#xff0c;mn矩阵可与一个np矩阵相乘&#xff0c;结果…

地铁智能运维要接哪些数据?智能运维能力包括哪些方面

在构建一个地铁智能运维系统中&#xff0c;我们需要接入哪些关键数据以实现高效和智能化的运维管理&#xff1f;地铁智能运维能力包含哪些方面&#xff1f;如何提升地铁系统的整体运营效率和安全性&#xff1f;  在构建地铁智能运维系统时&#xff0c;应连接以下关键数据&…

第十八篇【传奇开心果短博文系列】Python的OpenCV库技术点案例示例:图像修复和恢复

传奇开心果短博文系列 系列短博文目录Python的OpenCV库技术点案例示例系列短博文目录前言一、常用的图像修复与恢复技术二、插值方法示例代码三、基于纹理合成的方法示例代码四、基于边缘保持的方法示例代码五、基于图像修复模型的方法示例代码六、基于深度学习的方法示例代码七…

AutoSAR(基础入门篇)7.1-汽车电子开发软件DaVinci Developer界面简介

目录 一、Dev界面简介 二、Dev使用流程简介 一、Dev界面简介 经典的是更老的版本,博主这里用的是较新一点的版本,不过大家不必担心版本问题,因为操作几乎都一样。我们先简单浏览一遍这个界面,大致从 上往下看可以分为这么几部分: 1. 导航栏:File那一排 2. 工具栏&…

Redis集群模型

主从 全量同步 增量同步 哨兵 分片集群

微信小程序上传代码教程

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 小程序上传代码到gogs上面来 整体架构流程 小程序也要远程连接仓库&#xff0c;实现代码上传 技术名词解释 微信开发者工具gogs 技术细节 连接gogs仓库地址 微信小程序需要head将本地代码和gogs代码同步 小结 …

JAVA反射总结学习

初始反射反射的基本操作反射安全性问题 反射是指在Java运行状态中: 给定一个类对象(Class对象)&#xff0c;通过反射获取这个类对象(Class对象)的所有成员结构&#xff1b; 给定一个具体的对象&#xff0c;能够动态地调用它的方法及对任意属性值进行获取和赋值&#xff1b; …

[word] word如何打印背景和图片? #微信#其他#经验分享

word如何打印背景和图片&#xff1f; 日常办公中会经常要打印文件的&#xff0c;其实在文档的打印中也是有很多技巧的&#xff0c;可以按照自己的需求设定&#xff0c;下面给大家分享word如何打印背景和图片&#xff0c;一起来看看吧&#xff01; 1、打印背景和图片 在默认的…

离线数仓(一)【数仓概念、需求架构】

前言 今天开始学习数仓的内容&#xff0c;之前花费一年半的时间已经学完了 Hadoop、Hive、Zookeeper、Spark、HBase、Flume、Sqoop、Kafka、Flink 等基础组件。把学过的内容用到实践这是最重要的&#xff0c;相信会有很大的收获。 1、数据仓库概念 1.1、概念 数据仓库&#x…

《动手学深度学习(PyTorch版)》笔记8.3

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过&…

【开源】JAVA+Vue.js实现计算机机房作业管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 登录注册模块2.2 课程管理模块2.3 课时管理模块2.4 学生作业模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 课程表3.2.2 课时表3.2.3 学生作业表 四、系统展示五、核心代码5.1 查询课程数据5.2 新增课时5.3 提交作…

【PyTorch][chapter 15][李宏毅深度学习][Neighbor Embedding-LLE]

前言&#xff1a; 前面讲的都是线性降维&#xff0c;本篇主要讨论一下非线性降维. 流形学习&#xff08;mainfold learning&#xff09;是一类借鉴了拓扑流行概念的降维方法. 如上图,欧式距离上面 A 点跟C点更近&#xff0c;距离B 点较远 但是从图形拓扑结构来看&#xff0c; …

「C++ 类和对象篇 10」初始化列表

目录 一、什么是初始化列表&#xff1f; 二、为什么需要初始化列表&#xff1f; 三、初始化列表怎么使用&#xff1f; 3.1 在构造函数中使用初始化列表 3.2 注意 3.3 结论 3.4 应用场景 四、初始化列表的初始化顺序 五、另一种初始化成员变量的方法 【总结】 一、什么是初始化…