再求教一个算法问题

diejia_new 2011-03-26 01:40:28
一个任意的多边形(有n个边),不规则,求面积;

用C语言实现

下面是别人给的提示,不过我还是不知道怎么做

以将边安装顺时针顺序排序,然后全部映射到X方向
...全文
101 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xali 2011-03-26
  • 打赏
  • 举报
回复
//求多边形面积的简单方法
#include "stdio.h"
typedef struct tagPoint
{
double x;
double y;
}FPoint;
double Area(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",Area(pArray1,4));
printf("Area2 = %f\n",Area(pArray2,5));
printf("Area3 = %f\n",Area(pArray3,9));
}
super_admi 2011-03-26
  • 打赏
  • 举报
回复
应该划分为三角形来计算,且应该分两次划分。

第一划分,是对多边形分类:凸多边形和凹多边形。
评判标准:整个多边形只在其任意一条边的一侧,则为凸多边形。若存在一条边(两头无限延长),将多边形一分为二,则此多边形为凹多边形。
划分完成:第一次划分完后,你应该得到一组凸多边形。

第二次划分,是将凸多边形划分为三角形。
在凸多边形上任意选取一个起点,然后连接该点和多边形上的其它点,则可以把凸多边形划分为多个三角形。
分别对每个三角形求面积,最后相加,则得到最后的面积。
baihacker 2011-03-26
  • 打赏
  • 举报
回复
如果是简单多边形的话,也就是说两条边不自交,可以
通过 OA * OB + OB * OC ... OX * OA 来求
OA表示0到A这个顶点的向量,说白了在值上和A的坐标相同。
*表示叉积(x0,y0)*(x1,y1) = x0 * y1 - y0 * x1
也是
|x0 y0|
|x1 y1|
这个矩阵的行列式

求出来除以2,再取绝对值就行了。
diejia_new 2011-03-26
  • 打赏
  • 举报
回复
不规则,不好划分
ouyh12345 2011-03-26
  • 打赏
  • 举报
回复
应该先划分成三角形吧

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧