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

原创 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来说,体积就变成了面积),而物体在水中是一个动态的过程,因此可以通过求解物体水面以下的面积来实时地计算浮力。

 

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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qwertyupoiuytr/article/details/53999446

高级特效-多边形特效/PS高端辅助/动态人像速成特效 [精品推荐]

-
  • 1970年01月01日 08:00

计算凸多边形的重心及面积的方法

首先要从最简单的三角形进行分析,所谓三角形的重心就是三角形的外心,即中线的交点。如下图所示,三角形的3个顶点的坐标按照逆时针依次为(x1,y1),(x2,y2),(x3,y3),重心坐标为(xg,yg...
  • chao_xun
  • chao_xun
  • 2012-10-03 22:10:57
  • 4102

多边形面积计算公式

function polygonArea(points) { var i, j; var area = 0; for (i = 0; i < points.length; i++) { j...
  • jcx5083761
  • jcx5083761
  • 2015-02-25 11:46:40
  • 2247

任意多边形的面积公式

设Ω是m边形(如下图),顶点沿边界正向排列,,坐标依次为 建立Ω的多边形区域向量图。 由图知坐标原点与多边形任意相邻的两个顶点构成一个三角形,而三角形的面积可由三个顶点构成的两个平面向...
  • hemmingway
  • hemmingway
  • 2012-07-31 15:22:34
  • 75113

任意多边形的面积计算

任意给出一个三角形ΔABC,设其顶点坐标分别为A(x1, y1),B(x2, y2),C(x3, y3),那么根据线性代数的知识,ΔABC的有向面积可表示为: 其中,ΔABC顶点A、B、C逆时针给...
  • LemonGirl131
  • LemonGirl131
  • 2016-04-12 09:56:48
  • 5484

C++实现——任意多边形的面积

//求任意多边形的面积 /*语法:result = polygonarea(vector&polygon, int N); 参数: polygon:多变形顶点数组 N:多边形顶点数目 返回值:多边形面...
  • langmanqishizaijia
  • langmanqishizaijia
  • 2016-04-08 15:55:08
  • 2676

计算凸多边形面积

  • 2014年10月27日 13:41
  • 697B
  • 下载

bzoj2618凸多边形面积交

http://www.lydsy.com/JudgeOnline/problem.php?id=2618 (⊙v⊙)嗯,几何大水题 题意是要求n个凸多边形(逆时针给定点)的面积并,数据很弱。 把...
  • nikelong0
  • nikelong0
  • 2016-03-22 10:08:08
  • 932

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

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

根据各点坐标计算多边形面积

  • 2015年08月08日 17:27
  • 138KB
  • 下载
收藏助手
不良信息举报
您举报文章:根据凸多边形顶点坐标来计算面积算法与实现
举报原因:
原因补充:

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