已知任意一个多边形的各个顶点的坐标,怎么去求该多边形的面积?(写下代码和思想--C语言)

 我来答
匿名用户
推荐于2017-11-26
展开全部
叉乘(或者叫向量积)设多边形的点按某顺序依次是(x1,y1),(x2,y2),...,(xn,yn)我们任选一个点和每条边相连,相邻的边做叉乘再除以2(构成三角形的有向面积),一般我们选原点(0,0)则面积S=(x1y2-x2y1)/2+(x2y3-x3y2)/2+...+(xny1-x1yn)/2这里S是有向面积 还要取绝对值程序很简单了 如果数组标号是0到n-1则double s=0;for (int i=0;i<n;i++) s+=((double)x[i]*y[(i+1)%n]-(double)x[(i+1)%n]*y[i])/2;s=fabs(s);
uliaxingn
2012-12-18 · 超过23用户采纳过TA的回答
知道答主
回答量:59
采纳率:0%
帮助的人:59.3万
展开全部
#include<iostream.h>
#include<math.h>
#include<iomanip.h>

struct POINT
{
double x;
double y;
}p[1000];

struct LINESEG //边
{
POINT s;
POINT e;
};

double multiply(POINT sp,POINT ep,POINT op)
{
return ((sp.x-op.x)*(ep.y-op.y)-(ep.x-op.x)*(sp.y-op.y));
}

double Max(double p1,double p2)
{
return p1>p2?p1:p2;
}
double Min(double p1,double p2)
{
return p1<p2?p1:p2;
}
bool intersect(LINESEG u,LINESEG v)
{ return//((一条线段的最大值要大于另一线段的最小值)

//排斥实验
(Max(u.s.x,u.e.x)>=Min(v.s.x,v.e.x))&&
(Max(v.s.x,v.e.x)>=Min(u.s.x,u.e.x))&&
(Max(u.s.y,u.e.y)>=Min(v.s.y,v.e.y))&&
(Max(v.s.y,v.e.y)>=Min(u.s.y,u.e.y))&&
//跨立实验
(multiply(v.s,u.e,u.s)*multiply(u.e,v.e,u.s)>=0)&&
(multiply(u.s,v.e,v.s)*multiply(v.e,u.e,v.s)>=0);
}
//这里使用了归纳x0y1-x1y0+x1y2-x2y1+x2y3-x3y2+x3y0-x0y3=
//(x3-x1)y0+(x0-x2)y1+(x1-x3)y2+(x2-x0)y3
double area_of_polygon(int vcount,POINT polygon[])
{
int i;
double s=0.00;
if (vcount<3) return 0;
for(i=0;i<vcount;i++)
s+=polygon[i].x*polygon[i+1].y-polygon[i+1].x*polygon[i].y;
return s/2;
}

bool issimple(int vcount,POINT polygon[])
{
int i,cn;
LINESEG l1,l2;
for(i=0;i<vcount;i++)
{
l1.s=polygon[i];
l1.e=polygon[(i+1)%vcount];
cn=vcount-3;//需要判断与边l1是否相交的边的条数
while(cn) //如果不相邻的两条边相交就退出,说明不是简单多边形
{
l2.s=polygon[(i+2)%vcount];
l2.e=polygon[(i+3)%vcount];
if(intersect(l1,l2))
break;
cn--;
}
if(cn)
return false;
}
return true;
}
int main()
{
int n,i,num;
num=0;
while(1)
{
cin>>n;
if(n==0)
break;
num++;
for(i=0;i<n;i++)
cin>>p[i].x>>p[i].y;
cout<<"Figure "<<num<<": ";
cout<<setiosflags(ios::fixed)<<setprecision(2);
if(issimple(n,p))
{
cout<<fabs(area_of_polygon(n,p))<<endl;
}
else
cout<<"Impossible"<<endl;
cout<<endl; //Print a blank line between each test cases.
//这里将n=0也看做一个case,因为0 <= n <= 1000,虽然n=0,不被处理
}
return 0;
}

这是网上找到的,经过测试可行,有一些小瑕疵,你可以自己改
他理论应该是:
平面上任意多边形面积为:

S = 1/2×( ( X1*Y2-X2*Y1 ) + … + ( Xk*Yk+1-Xk+1*Yk ) +
… + ( Xn*Y1-X1*Yn ) ) ---------- ①

注:书上多给出的是行列式|Xk Yk |的形式。
|Xk+1 Yk+1|

需要注意的是,如果一系列点按逆时针排列算出的是正面积,而如果是顺时针的话算出的则是一个负面积。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-08-22
展开全部
用三角形的行列式面积算法来求
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式