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

如题所述

#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|

需要注意的是,如果一系列点按逆时针排列算出的是正面积,而如果是顺时针的话算出的则是一个负面积。
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-12-18

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

本回答被网友采纳
第2个回答  2012-12-18
凸多边形还是凹多边形?

...怎么去求该多边形的面积?(写下代码和思想--C语言)
用叉乘(或者叫向量积)设多边形的点按某顺序依次是(x1,y1),(x2,y2),...,(xn,yn)我们任选一个点和每条边相连,相邻的边做叉乘再除以2(构成三角形的有向面积),一般我们选原点(0,0)则面积S=(x1y2-x2y1)\/2+(x2y3-x3y2)\/2+...+(xny1-x1yn)\/2这里S是有向面积 还要取绝对值...

...怎么去求该多边形的面积?(写下代码和思想--C语言)
printf("多边形的面积是:%.2lf\\n", area);return 0;} ```这段代码首先定义了一个计算多边形面积的函数`calculatePolygonArea`,它接受顶点的数量和一个包含x坐标和y坐标的数组。然后,在`main`函数中,程序从用户那里获取多边形的顶点数和坐标,并调用`calculatePolygonArea`函数来计算面积并输出结果。

已知多边形各顶点坐标如何计算多边形面积
回答:多边形的面积可通过分割成很多个三角形面积之和来求得!通过多边形各顶点坐标可以求得各边长,再采用海伦公式,计算分割后的小三角形的面积。海伦公式如下:假设在平面内,有一个三角形,边长分别为a、b、c,三角形的面积S可由以下公式求得: S=sqrt(p(p-a)(p-b)(p-c))公式中的p为半周长...

利用多边形顶点坐标计算多边形面积的方法
1. 多边形的顶点坐标需要在格点上,即坐标的每个分量都是整数。2. 多边形的边界是由格点组成的,边上的点指的是多边形边缘上的格点。3. 多边形内部的点是指那些不在边界上的格点。为了计算多边形的面积,可以先使用一个辅助公式来确定边界上格点的数量,该公式为:\\[ \\text{格点数} = \\text{gcd}(...

多边形面积公式已知多边形各顶点的坐标值,求面积
对于外切正方形,面积为4R²,内接正方形面积为2R²。对于五边形以上的多边形,可以将其分割成等边三角形来计算,使用内角和公式——(n-2) * 180°。已知三个点A(x1,y1)、B(x2,y2)、C(x3,y3)的面积公式为:S(A,B,C) = |x1x2x3| * |y1y2y3| * 0.5 = [(x1-x3)(...

任意多边形怎么求面积
问题一:已知任意多边形的边长,如何计算面积?1. 将多边形的各顶点坐标在EXCEL中以(X,Y)格式列出,确保至少有一个点可以作为原点。2. 在CAD软件中输入PL命令或点击多段线图标,以绘制多边形。3. 将EXCEL中的坐标数据复制并粘贴到CAD命令栏,软件会自动生成多边形。4. 选择多边形并将其转换为面域。5...

怎么利用多边形顶点坐标求多边形面积
N边形各顶点的坐标分别为(x1,y1), (x2,y2), (x3,y3),……, (xn,yn)则S=(1\/2)|x1,y1|+|x2,y2|+|x3,y3|+……+|xn,yn| ………|x2,y2| |x3,y3| |x4,y4|………|x1,y1| (上下两行为二阶行列式。)

C语言编程求多边形面积, (1)输入任意三点以上坐标,计算此多边形面
输入边数 n, 输入 多边形各顶点 x,y 坐标,逆时针顺序 (保证 叉乘积 为 正)。各顶点 x,y 坐标 减去 a[0][0]。以 a[0][0] 为主 计算各三角形面积并累加。include <stdio.h> include <stdlib.h> main( ){ int i,j,n;double s=0;double a[15][2];scanf("%d",&n);for(...

多边形面积公式已知多边形各顶点的坐标值,求面积
R方 外切正方形:4R方 内接正方形:2R方 五边形以上的就分割成等边三角形再算 内角和公式——(n-2)*180`我们都知道已知A(x1,y1)、B(x2,y2)、C(x3,y3)三点的面积公式为 |x1 x2 x3| S(A,B,C)= |y1 y2 y3| 0.5 = [(x1-x3)*(y2-y3)- (x2-x3)*(y1-y3)]*0.5 |1...

假设有多边形顶点坐标(x1,y1),(x2,y2),(x3,y3),(x4,y4),(x5,y5),求...
坐标系当中的多边形问题,都可以化为三角形问题 5个点就可以划分成三个三角形,各自计算面积即可,三角形公式如下:当然,要对行列式取绝对值

相似回答