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

2025-02-23 14:27:20
推荐回答(3个)
回答1:

#include
#include
#include

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}
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 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 {
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 cin>>p[i].x>>p[i].y;
cout<<"Figure "< cout< if(issimple(n,p))
{
cout< }
else
cout<<"Impossible"< cout< //这里将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|

需要注意的是,如果一系列点按逆时针排列算出的是正面积,而如果是顺时针的话算出的则是一个负面积。

回答2:

当时我在HDU做的时候也卡这,但这其实就是公式问题而已。。。看图

回答3:

凸多边形还是凹多边形?