根据凸多边形顶点坐标来计算面积算法与实现

原创 2017年01月03日 23:41:16

本文我们来介绍一下如何利用凸多边形的所有顶点的坐标来计算其面积,并使用该算法制作一个小的示例程序。

注:对于凹多边形的面积,可以将其分解为若干个凸多边形分别计算求和,关于凹多边形的分解算法请参考Box2d中使用b2Separate开源代码创建凹多边形及其算法分析

求解的思路其实非常简单,对于任何凸多边形,我们以它的任意一个顶点为一个端点,连接该顶点与其他所有的顶点得到若干条线段,就可以将这个多边形切割成若干个三角形,如下图:

【原创】根据凸多边形顶点坐标来计算面积算法与实现 - 远行的风 - 风的驿站

对于得到的任何一个三角形,它的三个顶点都是多边形的顶点,因此其坐标是已知的(我们假定多边形的顶点坐标为已知量)。那么我们就可以利用三个顶点的坐标求解每一个三角形的面积(关于如何利用坐标求解三角形面积,请参考游戏中两个常用的数学运算推导即算法推论)。于是我们得到下面的算法步骤:

对于给定的顶点数组vertexes,数组大小为n(即n边形),我们选取第一个顶点vertexes[0]作为起点,从i=1开始,一直循环到i=n-2,每次计算顶点vertexes[0],vertexes[i],vertexes[i+1]组成的三角形面积,将从1到n-2次循环得到的所有三角形的面积累加起来,就得到了vertexes围成的多边形的面积。

如果给定的顶点数组不是按照顺时针或者逆时针的顺序排列,而是乱序的,可以对顶点进行重新排序,具体算法请参考Box2D中切割刚体效果的实现一览(完)中reorderVertexes的方法实现。

下面我们来制作一个小例子,先来看一下最终的运行效果(使用的是Box2d2.3.1的模板创建的工程):

【原创】根据凸多边形顶点坐标来计算面积算法与实现 - 远行的风 - 风的驿站

在屏幕上任意绘制一个凸多边形,然后最上方显示出所绘制的多边形的面积。

关于如何绘制多边形,记录所绘制的顶点以及将绘制的路径显示在场景中,请参考Box2d中使用开源的PRKit库来制作任意形状的多边形刚体的纹理。我们将绘制的颜色改为红色(因为要添加的参考网格的颜色想要使用白色,当然也可以按照自己的喜好来设置)。

接着添加绘制参考网格的方法:

-(void) drawGrids {

    CGSize size= [[CCDirector sharedDirector] winSize];

    floatwinHeight = size.height;

    floatwinWidth = size.width;

    intverCount = winWidth / PTM_RATIO;

    inthorCount = size.width / PTM_RATIO;

    for (int i= 1; i < verCount-5; i++) {

        ccDrawLine(ccp(0,i*PTM_RATIO), ccp(winWidth, i*PTM_RATIO));

    }

    for (int i= 1; i < horCount; i++) {

        ccDrawLine(ccp(i*PTM_RATIO,0), ccp(i*PTM_RATIO, winHeight));

    }

}

方法比较简单,我们知道Box2d中单位“米”与像素的转换比例就是PTM_RATIO,因此我们使用这个转换比例来作为相邻网格线的间距,这样单个网格的面积就是1平方米。同样,我们将绘制路径的取样距离也设置为PTM_RATIO,这样方便我们验证结果。

下面两个算法一个是计算三角形面积的算法,另一个是计算多边形面积的算法:

-(float)calculatePolygonArea:(NSMutableArray*) vertexes {

//    vertexes= [self reorderVertexes:vertexes];

    floatresult = 0;

    intvertexCount = [vertexes count];

    CGPointstartPoint = [vertexes[0] CGPointValue];

    for (int i= 1; i < vertexCount - 1; i++) {

        result+= [self calculateTriangleArea:startPoint pointB:[vertexes[i] CGPointValue]pointC:[vertexes[i+1] CGPointValue]];

    }

    

    returnresult;

}

 

-(float)calculateTriangleArea:(CGPoint) pointA

                        pointB:(CGPoint)pointB

                        pointC:(CGPoint)pointC {

    floatresult =  (pointA.x * pointB.y + pointB.x * pointC.y + pointC.x *pointA.y

                     -pointA.y * pointB.x - pointB.y * pointC.x - pointC.y * pointA.x) * 0.5f;

    returnresult > 0 ? result : -result;

}

实现之后,在ccTouchEnded方法中调用calculatePolygonArea即可。

 

这里我能想到的两个关于实际物理模拟的过程中的应用情景:

一个是计算物体的质量,根据物体的密度和顶点坐标,可以计算出物体的质量。

另一个应用场景是可以通过面积来计算在液体中物体受到的浮力,因为我们知道浮力F等于液体密度乘以重力常量再乘以物体排开液体的体积(对于2D来说,体积就变成了面积),而物体在水中是一个动态的过程,因此可以通过求解物体水面以下的面积来实时地计算浮力。

 

好了,教程就写到这儿,如果有问题欢迎留言。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

nyoj815三角形(已知三角形的三边长或三顶点坐标求面积)&& nyoj68三点顺序(向量叉积)

题目信息                                         &#...

C++:已知各顶点坐标求多边形面积

woj上的1213和1402题,给出顶点坐标求出多边形面积。原理: 任意多边形的面积可由任意一点与多边形上依次两点连线构成的三角形矢量面积求和得出。 分析: 由于给出的点是相对于我们的坐标原点的...

已知三角形三顶点坐标,求三角形面积的表达式 找出求果园里的树的解决方案

已知直角坐标系3点p(a,b),m(c,d),n(e,f) 求三角形pmn面积 解: 无论三角形的顶点位置如何,△PMN总可以用一个直角梯形(或矩形)和两个直角三角形面积的和差来表示 而...

SGU 120. Archipelago 计算几何 正n边形个顶点坐标

题目链接点这儿 QAQ这题做的真痛苦。。。 题意就是

OPENGL-ES 球体顶点坐标计算

//创建球体模型的顶点坐标  bool OGLESFiveSpheres::CreateGeometry()  {      unsigned int i;    ...

CAD多段线顶点坐标

38 WebGL针对单独的顶点坐标绘制组成模型

这一节和上一节绘制的模型是一模一样的效果,就是区别是这一节,对每个模型都定义了单独的一组顶点数据,并存储在了一个单独的缓存区中。通常,一个部件的顶点数据包括坐标、法向量、索引值等,但是这里的每个部件都...

Direct3D顶点坐标变换

Direct3D顶点坐标变换 分类: 游戏开发2010-06-29 18:19 1724人阅读 评论(0) 收藏 举报 direct3dfloat图形360c 开始的话:顶点...

求旋转矩形的四个顶点坐标,用来做旋转矩形的碰撞检测

package com.example.com.android.test;import java.util.Vector; import java.lang.Math;import android....
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)