任意多边形面积的计算

摘要:
1-原理介绍原理讨论1:书中给出的定理是,任意多边形的面积可以通过将多边形上的任意点和两点按顺序连接而形成的三角形矢量面积求和来获得。一个三角形是由两个与图和多边形的原点任意相邻的顶点形成的,三角形的面积可以由三个顶点形成的两个平面向量的外积得到。任意多边形的面积公式多边形计算公式的计算与原点的选择无关。通常,可以选择一个点(0,0)或多边形的第一个点。

1-原理介绍

       原理论述1:

       书中给出定理:任意多边形的面积可由任意一点与多边形上依次两点连线构成的三角形矢量面积求和得出。

       矢量面积=三角形两边矢量的叉乘。

       如下图:

任意多边形面积的计算第1张

 

按定理,多边形面积由P点与A-G的各顶点连接所构成的三角形矢量面积构成,假定多边形顶点坐标顺序为A-G,逆时针为正方向,则有如下结论:

PAB,PBC,PCD均为顺时针,面积为负;

PDE,PEF,PFG,PGA均未逆时针,面积为正;

但无论正负,均可通过P点与顶点连线的矢量叉乘完成,叉乘结果中已包含面积的正负。

        原理论述2:

设Ω是m边形(如下图),顶点任意多边形面积的计算第2张沿边界正向排列,,坐标依次为

任意多边形面积的计算第3张

建立Ω的多边形区域向量图。

由图知坐标原点与多边形任意相邻的两个顶点构成一个三角形,而三角形的面积可由三个顶点构成的两个平面向量的外积求得。

任意多边形的面积公式

任意多边形面积的计算第4张

多边形计算公式的计算和原点的选取没有关系,通常可以选点(0,0)或者多边形的第一个点(这个时候比较直观了,看起来就是把多边形分成一个个三角形和加起来,读者自己可以画个图)就可以了。


任意多边形面积的计算第5张

2-程序设计

采用C++的vector(动态数组)存储顶点坐标。

为方便计算,直接将P点定为原点(0,0),则多边形顶点xy坐标即为向量在xy上分量。

循环计算多边形顶点坐标每一点与下一点之间的线段,及这两点与P连线的矢量所围成的三角形面积。

计算面积的函数代码如下:

C++的实现

复制代码
iArea=iArea+(vecPoly[iCycle].x*vecPoly[(iCycle+1) % iCount].y-vecPoly[(iCycle+1) % iCount].x*vecPoly[iCycle].y);
int intAreaCalc(vector<myPoint> &vecPoly)
{
    int iCycle,iCount,iArea;
    iCycle=0;
    iArea=0;
    iCount=vecPoly.size();

    for(iCycle=0;iCycle<iCount;iCycle++)
    {    
        iArea=iArea+(vecPoly[iCycle].x*vecPoly[(iCycle+1) % iCount].y-vecPoly[(iCycle+1) % iCount].x*vecPoly[iCycle].y);
    }
    
    return abs(0.5*iArea);
}
复制代码

注意,要注意的是最后一个顶点,要与第一个顶点练成三角形,可将循环变量对顶点总数求同余,则循环过程中的最后一点+1后,自然会成为第一个顶点,上述代码中的“% iCount”即为解决此问题。

C#的实现

      #region CalculateArea Function
        /// <summary>
        /// 计算多边形面积的函数
        /// (以原点为基准点,分割为多个三角形)
        /// 定理:任意多边形的面积可由任意一点与多边形上依次两点连线构成的三角形矢量面积求和得出。矢量面积=三角形两边矢量的叉乘。
        /// </summary>
        /// <param name="vectorPoints"></param>
        /// <returns></returns>
        public static float CalculateArea(List<PointF> vectorPoints)
        {
            int iCycle, iCount;
            iCycle = 0;
            float iArea = 0;
            iCount = vectorPoints.Count;

            for (iCycle = 0; iCycle < iCount; iCycle++)
            {
                iArea = iArea + (vectorPoints[iCycle].X * vectorPoints[(iCycle + 1) % iCount].Y - vectorPoints[(iCycle + 1) % iCount].X * vectorPoints[iCycle].Y);
            }

            return (float)Math.Abs(0.5 * iArea);
        }
        #endregion
参考文章
http://www.cnblogs.com/vbspine/archive/2013/03/28/2987818.html

http://blog.csdn.net/hemmingway/article/details/7814494

免责声明:文章转载自《任意多边形面积的计算》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Objective-C-基础知识设计模式学习-单例模式下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

OpenGL ES着色器语言----------------储存修饰符

一、存储修饰符 本地变量只能使用存储修饰符const。 函数参数只能用const。函数返回值类型和结构体字段不要使用const。 从一个运行时着色器到下一个运行时着色器之间进行数据类型通信是不存在的。这阻止了同一个着色器在多个顶点和片元之间同时执行。 没有存储修饰符或仅仅使用const修饰符的全局变量,可能在main()执行前进行初始化。Uniforms...

OpenGL实现多层绘制(Layered Rendering) [转]

http://blog.csdn.net/u010462297/article/details/50589991 引言 在某些情况下会需要用到多层绘制。FBO下有多个颜色挂接点(Color Attachment),可以用不同的挂接点挂接不同的纹理对象,实现绘制多张纹理(MRT),这在之前的文章里已经有所描述。但是有时候这种方法是不够好用的: - 当纹理非...

Unity3d Shader

Unity3d Shader 预览Surface Shader主要用来实现光照相关处理,可能更简洁。Vertex and Fragment Shader如果不与光照交互, 则可以用这个shader,更录活fixed function shaders固定shader主要用于老旧卡ShaderLab不管写哪种shader,最终通过shaderLab实现,其组织结...

有趣的深度图:可见性问题的解法

0x00 前言 说起深度,朋友们一定都不陌生。为了解决渲染场景时哪部分可见,哪部分不可见的问题(即可见性问题,也被称为隐藏面移除问题,hidden surface removal problem,从术语这个角度看,技术的发展有时也会带动心态向积极的方向的变化),计算机图形学中常使用画家算法或深度缓冲的方式。 这也是在处理可见性问题时的两个大方向上的思路:O...

怎样生成一个顶点迭代器(MItMeshVertex)

最近修改一个maya中的jlCollisionDeformer工具,该工具有一个明显不足,变形后顶点分布太乱,无法满足生产需求。于是考虑对该变形后的顶点进行平滑处理。既然要做平滑处理就要获取当前点及与该点保持连接关系的点的坐标,再以此为基础代入平滑算法。 我的基本思路是利用maya.OpenMaya模块中现有的api来获得一个基于当前模型的顶点迭代器(MI...

B样条曲线曲面(附代码)

1 B样条曲线 1.1 B样条曲线方程 B样条方法具有表示与设计自由型曲线曲面的强大功能,是形状数学描述的主流方法之一,另外B样条方法是目前工业产品几何定义国际标准——有理B样条方法(NURBS)的基础。B样条方法兼备了Bezier方法的一切优点,包括几何不变性,仿射不变性等等,同时克服了Bezier方法中由于整体表示带来不具有局部性质的缺点(移动一个...