首页 > 编程语言 >[几何算法]任意多边形求面积

[几何算法]任意多边形求面积

时间:2024-02-23 16:01:12浏览次数:32  
标签:cnt 多边形 res 面积 算法 points 平面 任意

求任意平面多边形的面积

通过鞋带定理,在已知多边形各顶点的情况下,可以快速计算出其面积

问题分析

设一个多边形顶点按逆时针或顺时针顺序为 $$ P_1(x_1, y_1), P_2(x_2, y_2), \ldots, P_n(x_n, y_n) $$,其中 $$ P_1 = P_{n+1} $$ (首尾相连形成闭合多边形)。根据鞋带定理,该多边形的面积 A 可以通过以下公式计算:

\[A = \frac{1}{2} |(x_1y_2 - y_1x_2) + (x_2y_3 - y_2x_3) + \cdots + (x_{n-1}y_n - y_{n-1}x_n) + (x_ny_1 - y_nx_1)| \]

进一步简化该公式可以得到:

\[A = \frac{1}{2} |(x_1+x_2)(y_1-y_2) + (x_2+x_3)(y_2-y_3) + \cdots + (x_{n-1}+x_n)(y_{n-1}-y_n) + (x_n+x_1)(y_n-y_1)| \]

该定理实质上是将多边形面积,转化为多个小三角形的面积之和,可以使用数学归纳法进行证明,具体不过多赘述。

代码实现

C#

public static double PolygonArea(point[] points)
{
    var cnt = points.Count;
    if (cnt < 3)
        return 0;

    double res = 0;
    for (int i = 0,j=cnt-1; i < cnt; i++) 
    {
        res += (points[j].X + points[i].X) * (points[j].Y - points[i].Y);
        j = i;
    }

    return Math.Abs(0.5*res);
}

拓展

计算任意平面的多边形

本代码计算结果为多边形所在平面平行于xoy平面时的,如需要其他平面的,可以通过变换矩阵,将原平面变换为xoy平面,再进行计算。

关于曲线

如果想要计算带曲线的多边形,可以通过离散化的方式,把曲线转化为多个顶点,然后进行计算,只要离散的精度比较高,几乎不存在误差。

标签:cnt,多边形,res,面积,算法,points,平面,任意
From: https://www.cnblogs.com/hardworkingR/p/18029755

相关文章

  • 基于yolov2深度学习网络的车辆行人检测算法matlab仿真
    1.算法运行效果图预览   2.算法运行软件版本MATLAB2022a 3.算法理论概述      近年来,深度学习在计算机视觉领域取得了显著成果,特别是在目标检测任务中。YOLO(YouOnlyLookOnce)系列算法作为其中的代表,以其高效和实时的性能受到广泛关注。YOLOv2,作为YOL......
  • 基于WIFI指纹的室内定位算法matlab仿真
    1.算法运行效果图预览  2.算法运行软件版本matlab2022a 3.算法理论概述        随着移动互联网和物联网技术的飞速发展,位置服务(LBS)已成为许多应用的核心功能,如导航、社交网络和智能物流等。室外定位技术,如全球定位系统(GPS),已相当成熟并广泛应用。然而,由于建......
  • CreateHolesInImage说明文档-对于遥感影像的空洞创建多边形矢量数据
    提取遥感影像的空洞地理处理工具箱特点:通用地理处理工具,支持任何遥感影像,包括无人机,卫星遥感,普通图片和gdb,mdb数据库等。速度快,极致效率,效率高,支持对多个文件夹下的任意多数据进行批处理使用简单,全自动话,无人工干预功能:提取空洞提取空洞和非空洞默认临时文件夹,结果文件夹默认临时......
  • 类欧几里得算法
    要求类似于这样的东西:\[\begin{align*}f(n,a,b,c)&=\sum\limits_{i=0}^n{\left\lfloor\frac{ai+b}{c}\right\rfloor}\\g(n,a,b,c)&=\sum\limits_{i=0}^n{\left\lfloor\frac{ai+b}{c}\right\rfloor}^2\\h(n,a,b,c)&=\sum\limits_{i=0}^......
  • day41 动态规划part3 代码随想录算法训练营 96. 不同的二叉搜索树
    题目:96.不同的二叉搜索树我的感悟:这题,考的概率不大,听一遍,过一遍就行。理解难点:二叉搜索树定义为什么是累加的听课笔记:代码示例:classSolution:defnumTrees(self,n:int)->int:dp=[0]*(n+1)#创建一个长度为n+1的数组,初始化为0d......
  • day40 动态规划part3 代码随想录算法训练营 343. 整数拆分
    题目:343.整数拆分我的感悟:题目很难,但我动力十足!!理解难点:如何拆分为什么要保留dp[i]听课笔记:代码示例:classSolution:defintegerBreak(self,n:int)->int:#思路:#dp[i]是到目前为止能拆分取的最大值#dp[i]可以拆成j*(集合)......
  • 十大经典排序算法
    十大经典排序算法.md0、算法概述0.1算法分类****十种常见排序算法可以分为两大类:比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间......
  • 文心一言 VS 讯飞星火 VS chatgpt (200)-- 算法导论15.2 4题
    四、用go语言,对输入链长度为n的矩阵链乘法问题,描述其子问题图:它包含多少个顶点?包含多少条边?这些边分别连接哪些顶点?文心一言:矩阵链乘法问题是一个经典的动态规划问题,其中给定一个矩阵链,我们需要确定一个乘法顺序,使得计算该链所需的总标量乘法次数最少。子问题图(也叫DAG,有......
  • Python数据结构与算法05——快速排序
    快速排序:递归defquick_sort(aimlist,first,last):#打印当前排序状态print(aimlist)#如果子列表只有一个元素或没有元素,直接返回iffirst>=last:return#初始化低位、高位和中间值low=firstheigh=lastmid=aimli......
  • 文心一言 VS 讯飞星火 VS chatgpt (199)-- 算法导论15.2 1题
    一、用go语言,对矩阵规模序列(5,10,3,12,5,50,6),求矩阵链最优括号化方案。文心一言,代码正常运行:在Go语言中,为了找到矩阵链乘法的最优括号化方案,我们通常会使用动态规划(DynamicProgramming,DP)的方法。矩阵链乘法的问题是要确定计算矩阵乘积的最有效顺序,以最小化乘法操作的次数。这里......