计算多边形面积.docx
- 文档编号:16965356
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:17
- 大小:285.71KB
计算多边形面积.docx
《计算多边形面积.docx》由会员分享,可在线阅读,更多相关《计算多边形面积.docx(17页珍藏版)》请在冰点文库上搜索。
计算多边形面积
计算多边形面积
实验报告
一·实验内容;2
二·实验目的;2
三·实验要求;3
四·算法分析;4
五·源程序及注释;6
1,主函数6
2,判断函数8
3,计算多边形面积函数11
4,计算三角形面积函数13
六·流程图;14
七·结果分析;15
八·改进建议;18
九·实验分工。
18
计算多边形面积实验报告
王丹阳小组
一·实验内容;
☉一名中学生,对数学研究很感兴趣,或许,他思考的问题对专家来说太容易,但作为一名业余爱好者,特别是一位10岁的孩子,他的确很棒。
在数学问题上,他思路敏捷,对碰到的问题都能以数学的方式轻松解决。
☉一天,他看到桌子上他的4岁妹妹画的一些线条,想:
“这个多边形好像很规则,我刚刚学过怎样计算三角形、矩形和圆的面积,我肯定能计算这个图形的面积。
”
☉他认真的标注各多边形定点坐标,然后很快算出其面积是0.75。
☉当然,他不满足于计算如此简单的问题,他想:
“如果多边形是随机的,我如何计算它的面积呢?
”
☉请设计程序解决此问题。
二·实验目的;
(1)掌握c语言的基本编程技能,模块化编程思想,并初步学会在实际背景下灵活运用。
(2)设计程序算出任意给定的空间站的需要维护的面的总数。
三·实验要求;
☉输入:
包含多个图形。
每个图形第一行是一个整数n(0<=n<=1000),表示图形的定点数
接下来n行,每行是一对实数,表示定点(xi和yi坐标)。
坐标是有顺序的,表示从图形的第一个顶点到第二个顶点,从第二个顶点到第三个顶点,直到第n个顶点。
n=0表示输入结束。
☉输出:
对每个图形,输出图形编号,一个冒号,图形的面积或者字符串“Impossible”。
如果图形是多边形,计算其面积(精确到两位小数)。
根据输入的顶点序列,如果不能形成多边形(即一条线与另一条不相邻的线相交),输出“Impossible”,表示此图形不是多边形。
如果给定的顶点数不足以形成多边形,也输出“Impossible”。
每个测试例之间有一个空行。
输入:
5
00
01
0.50.5
11
10
4
00
01
10
11
0
输出:
Figure1:
0.75
Figure2:
Impossible
四·算法分析;
根据所给条件,应该把多边形面积分解成若干个三角形的面积来计算,然后逐个相加便可得到多边形的面积。
在此之前,必须判断输入得点能否围成封闭多边形。
判断是否能围城封闭多边形就是判断任意两条线段是否相交。
对于不与x轴相交的两条线段,可采用数学方法分别计算直线方程,然后计算交点坐标,在判断交点是否位于相关直线四个点之间,即两条线段是否相交。
相关公式
a1=(d1.y-d2.y)/(d1.x-d2.x);
a2=(d3.y-d4.y)/(d3.x-d4.x);
b1=d1.y-a1*d1.x;
b2=d3.y-a2*d3.x;
m=(b2-b1)/(a1-a2);
n=a1*m+b1;
(直线1:
y=a1*x+b1
直线2:
y=a2*x+b2
交点(m,n))
当a1=a2时,两直线平行,自然不存在相交的问题。
当不满足没有直线与x轴垂直时,只需对上述公式简单修改,便可判断两线段是否相交。
当所给图形中存在相交直线时,即可返回不能组成封闭图形。
当不存在相交直线时,即可采用分割法计算图形的面积。
在分割的过程中,应该注意分割线也不能与图形中固有的线和其他分割线相交。
如果出现相交的情况,应该立即停止分割,并把尚未分割的部分看成另一个多边形,调用计算函数本身进行计算。
这仍是一个递归调用的过程。
计算三角形面积时,可直接调用相关库函数简化程序,由三点坐标计算三角形面积的公式如下:
a=sqrt(pow(d1.x-d2.x,2)+pow(d1.y-d2.y,2));
b=sqrt(pow(d1.x-d3.x,2)+pow(d1.y-d3.y,2));
c=sqrt(pow(d2.x-d3.x,2)+pow(d2.y-d3.y,2));
cos=(pow(a,2)+pow(b,2)-pow(c,2))/(2*a*b);
s=0.5*a*b*sqrt(1-pow(cos,2));
s即为三角形的面积
综合以上算法,为简化函数的参数,本程序采用结构体数组作为数据类型,每个结构体存储一个点的两个坐标。
五·源程序及注释;
#include"stdio.h"
#include"conio.h"
#include
#include
typedefstructdia{//定义存储点所需结构体
doublex;
doubley;
}DIAN;
1,主函数
main()//主函数
{DIANdian[100];//点存储数组
intun;//点的数量
inti=0,j;
doublesum[10];//结果临时存储数组
intpanduan(DIANd1,DIANd2,DIANd3,DIANd4);//函数声明
doublejisuan(intn,DIANdian[]);
doublesanjiao(DIANd1,DIANd2,DIANd3);
printf("\t\t\t欢迎使用多边形面积计算系统\n");//用户交互界面
printf("*******************************************************************************\n");
for(j=0;j<10;j++)//主函数大循环,用于同时测试多个各测试例
{
printf("请输入第%d个图形所包含的点的个数___",j+1);//数据输入
scanf("%d",&un);
if(un==0)break;
for(i=0;i {printf("\n请输入第%d个点____",i+1); scanf("%lf%lf",&dian[i].x,&dian[i].y); } sum[j]=jisuan(un,dian);//计算多边形面积,并临时存储 } for(i=0;i {if(sum[i]==0) printf("第%d个图形不能围城封闭面积\n",i+1);//输出结果 else printf("第%d个图形的面积为%.2lf。 \n",i+1,sum[i]); } return0; } 2,判断函数 intpanduan(DIANd1,DIANd2,DIANd3,DIANd4)//判断能否组成多边形函数 {doublea1,a2,b1,b2,m,n; if(((d1.x! =d2.x)||(d1.y! =d2.y))&&((d1.x! =d3.x)||(d1.y! =d3.y))&&((d1.x! =d4.x)||(d1.y! =d4.y))&&((d3.x! =d2.x)||(d3.y! =d2.y))&&((d4.x! =d2.x)||(d4.y! =d2.y))&&((d4.x! =d3.x)||(d4.y! =d3.y))) {//判断是否有重合的点 if(((d1.x-d2.x)! =0)&&((d3.x-d4.x)! =0))//第一类: 两直线均不与x轴垂直 {a1=(d1.y-d2.y)/(d1.x-d2.x); a2=(d3.y-d4.y)/(d3.x-d4.x); b1=d1.y-a1*d1.x;//求两直线方程 b2=d3.y-a2*d3.x; if(a1==a2)return1;//判断两直线是否平行 else{ m=(b2-b1)/(a1-a2);//求两直线交点 n=a1*m+b1; if((((m<=d1.x)&&(m>=d2.x))||((m>=d1.x)&&(m<=d2.x)))&&(((n<=d1.y)&&(n>=d2.y))||((n>=d1.y)&&(n<=d2.y)))&&(((m<=d3.x)&&(m>=d4.x))||((m>=d3.x)&&(m<=d4.x)))&&(((n<=d3.y)&&(n>=d4.y))||((n>=d3.y)&&(n<=d4.y)))) return0;//判断两直线是否相交 elsereturn1; } } if(((d1.x-d2.x)==0)&&((d3.x-d4.x)==0))return1;//第二类: 两直线均与x轴垂直 if(((d1.x-d2.x)==0)&&((d3.x-d4.x)! =0))//第三类: 只有一条直线与x轴垂直 {a2=(d3.y-d4.y)/(d3.x-d4.x);//求直线方程 b2=d3.y-a2*d3.x; m=d1.x;//求两直线交点 n=a2*m+b2; if((((m<=d1.x)&&(m>=d2.x))||((m>=d1.x)&&(m<=d2.x)))&&(((n<=d1.y)&&(n>=d2.y))||((n>=d1.y)&&(n<=d2.y)))&&(((m<=d3.x)&&(m>=d4.x))||((m>=d3.x)&&(m<=d4.x)))&&(((n<=d3.y)&&(n>=d4.y))||((n>=d3.y)&&(n<=d4.y)))) return0;//判断两直线是否相交 elsereturn1; } if(((d3.x-d4.x)==0)&&((d1.x-d2.x)! =0))//第四类: 只有一条直线与x轴垂直 {a1=(d1.y-d2.y)/(d1.x-d2.x);//求直线方程 b1=d1.y-a1*d1.x; m=d3.x; n=a1*m+b1;//求两直线交点 if((((m<=d1.x)&&(m>=d2.x))||((m>=d1.x)&&(m<=d2.x)))&&(((n<=d1.y)&&(n>=d2.y))||((n>=d1.y)&&(n<=d2.y)))&&(((m<=d3.x)&&(m>=d4.x))||((m>=d3.x)&&(m<=d4.x)))&&(((n<=d3.y)&&(n>=d4.y))||((n>=d3.y)&&(n<=d4.y)))) return0;//判断两直线是否相交 elsereturn1; } } elsereturn1; } 3,计算多边形面积函数 doublejisuan(intun,DIANdian[])//计算函数,计算多边形的面积 {inti,j,key=1,key2=1; doubles=0; doublesanjiao(DIANd1,DIANd2,DIANd3);//函数声明 if(un<=2)return0; for(i=0;i for(j=0;j {key=panduan(dian[i],dian[i+1],dian[j],dian[j+1]);//调用判断函数,判断能否围成封闭多边形 if(key==0)return0; } for(j=1;j {key=panduan(dian[0],dian[un-1],dian[j],dian[j+1]);//判断能否围成多边形 if(key==0)return0; } for(i=0;i {key2=1; for(j=0;j if(panduan(dian[0],dian[i+1],dian[j],dian[j+1])==0)//判断分割线是否与其他线相交 {key2=0;break;} if(key2==1) s=s+sanjiao(dian[0],dian[i+1],dian[i+2]);//分别计算分割后三角形的面积并累加 elseif(key2==0) {s=s+jisuan(un-i-1,&(dian[i+1]));//若分割线与其他线相交,递归调用计算函数计算为分割部分的面积 gotowww;} } www: if(key2==0)//最后加上剩余部分的面积 s=s+sanjiao(dian[0],dian[i+1],dian[un-1]); returns; } 4,计算三角形面积函数 doublesanjiao(DIANd1,DIANd2,DIANd3)//计算三角形面积函数 {doubles,a,b,c,cos; a=sqrt(pow(d1.x-d2.x,2)+pow(d1.y-d2.y,2)); b=sqrt(pow(d1.x-d3.x,2)+pow(d1.y-d3.y,2));//分别计算三边长 c=sqrt(pow(d2.x-d3.x,2)+pow(d2.y-d3.y,2)); cos=(pow(a,2)+pow(b,2)-pow(c,2))/(2*a*b);//计算两边的夹角的余弦 s=0.5*a*b*sqrt(1-pow(cos,2));//计算三角形的面积 returns; } 六·流程图; 否是 否 是 是否 七·结果分析; 经过若干组数据的经验,上述程序完全能实现指定的功能。 能够准确识别各种类型的多边形并计算面积, 经过较为简单的数据与老师给定的数据的验证,该程序运行结果正确。 验证结果如图所示: 八·改进建议; 1、可引入文件,简化数据的输入,长久的保存结果,简化程序的调试。 2、可简化计算算法,使程序更便于理解。 3、更多的改进建议请老师指正。 九·实验分工。 小组成员: 11023224王丹阳 11023223王蒙 11023226覃业泰 11023228李赉龙
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算 多边形 面积