九月鹰飞

慎独自修,忠恕宽容,至诚尽性。

  VC知识库BLOG :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 登录 ::
  19 随笔 :: 13 文章 :: 158 评论 :: 3 Trackbacks
<2008年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

留言簿(6)

随笔分类

随笔档案

文章分类

文章档案

相册

搜索

最新评论

阅读排行榜

评论排行榜

<PRE>
不论凸多边形还是凹多边形,都可以采用向量叉乘的方法来求面积。代码如下
#include "stdafx.h"
#include "stdio.h"
typedef struct tagPoint
{
 double x;
 double y;
}FPoint;
double MianJi(FPoint *pArray,int NumPoint)
{
 if(NumPoint<3)return 0;

 double sum = 0;
 int m = 1;
 for(;;)
 {
  if(NumPoint < 3)break;
  FPoint r1;
  r1.x = pArray[m].x - pArray[0].x;
  r1.y = pArray[m].y - pArray[0].y;
  FPoint r2;
  r2.x = pArray[m+1].x - pArray[m].x;
  r2.y = pArray[m+1].y - pArray[m].y;
  sum += (r1.x * r2.y - r2.x * r1.y);
  m++;
  NumPoint --;
 }
 double result = (sum>0)?(sum/2.):(-sum/2.);
 return result;
}
//test
void main()
{
 FPoint pArray1[4]={{1,1},{1,2},{2,2},{2,1}};
 FPoint pArray2[5]={{0,0},{0,2},{2,2},{1,1},{2,0}};
 FPoint pArray3[9]={{0,0},{2,0},{2,1},{0,1},{0,2},{-2,0},{-1,0},{-1,-1},{0,-1}};
 printf("Area1 = %f\n",MianJi(pArray1,4));
 printf("Area2 = %f\n",MianJi(pArray2,5));
 printf("Area3 = %f\n",MianJi(pArray3,9));
}

iwaswzq 2007/1/10

</PRE>

posted on 2007-01-10 12:53 九月鹰飞 阅读(3705) 评论(4)  编辑 收藏

评论

# re: 求多边形面积的简单方法 2007-01-11 00:47 hpho
多连通多边形面积或者有重点的闭曲线呢?
重点是指{{0,0},{2,2},{0,2},{1,1},{2,0}} 其中{1,1}是重点.



# 不对,把pArray1调换一下次序就出错了 2007-01-11 09:02 jzhang
FPoint pArray1[4]={{2,2},{1,1},{1,2},{2,1}};

求多边形面积,首先要正确地找到多边形,也就是说哪些点之间有联线。对凸多边形,这个联线是唯一的,对凹的则不是唯一的。



# 对于点列要有正确的理解 2007-01-11 12:12 iwaswzq
to hpho :
点列的给出必须是按照顺序(顺时针或者逆时针),根据点列的顺序划出的多边形就是要求面积的多边形。顺序改变自然导致形状改变。多连通的也可以,比如8字形的多变性,给出点列的顺序应该是:
左上-〉右上-〉左下-〉右下。否则有可能就是四边形了。
你说的情况,计算结果没有问题。
to  jzhang :
你说的“对凹的则不是唯一的。”应该不对,只要按照你画这个多边形的时候连线的顺序给出点列,它就是唯一的。

# 如果次序是给定的那就没什么了 2007-01-11 12:32 jzhang
我认为的是根据用户在屏幕上输入的几个点,计算出多边形面积。

标题  
姓名  
主页
验证码 *
内容   
  登录  使用高级评论  Top
[使用Ctrl+Enter键可以直接提交]