控制结构程序设计实验报告_第1页
控制结构程序设计实验报告_第2页
控制结构程序设计实验报告_第3页
控制结构程序设计实验报告_第4页
控制结构程序设计实验报告_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

《测绘程序设计〔VC.net〕》上机实验报告〔VisualC++.Net〕班级:学号:姓名:序号:二零一零年三月实验2控制结构程序设计一、实验目的掌握VC++.net语言的根本语法;理解顺序结构、选择结构和循环结构程序设计的特点及应用;掌握对基于对话框的MFC应用程序设计方法;掌握一些简单算法二、实验内容编写前方交会的程序设计思路:通过反正切求得的角度范围是“-90—90”,而方位角的取值范围是“0—360”,因此需要通过方位角的象限来进行转换。还有一点不容无视,反正切函数求出的角度是弧度,而需要得到的方位角显示的是度、分、秒。因此需要转换。当dx>0时 dy>0,nQuadrant=1,Rad=atan(dy/dx)*180/PI dy<0, nQuadrant==4,Rad=(atan(dy/dx)+2*PI)*180/PI dy=0,Rad=0;当dx<0时, dy>0,nQuadrant=2,Rad=(atan(dy/dx)+PI)*180/PIdy<0,nQuadrant=3,Rad=(atan(dy/dx)+PI)*180/PI dy=0,Rad=180当dx=0时 dy>0,Rad=90 dy<0,Rad=270 dy=0,那么两点重合,方位角不存在了计算出弧度(Rad)后,再将其转化为度分秒输出就完成了。 界面设计:界面由5个文本框、5个静态框和2个命令按钮组成,需要完成输入2点坐标,输出方位角的功能其中文本控件属性设置为:IDIDC_EDIT1IDC_EDIT2IDC_EDIT3IDC_EDIT4IDC_EDIT5添加变量X1Y1X2Y2A主要代码:文件名TriAzimuthDlg.cpp#include"stdafx.h"#include"TriAzimuth.h"#include"TriAzimuthDlg.h"#include"math.h"…….voidCTriAzimuthDlg::OnBnClickedCancel(){ //TODO:在此添加控件通知处理程序代码 OnCancel();}constdoublePI=3.1415926;voidCTriAzimuthDlg::OnBnClickedOk(){ //TODO:在此添加控件通知处理程序代码 //OnOK();}//将弧度转化成度分秒形式doubleRad_To_Dms(doubleRad){ doubledDeg,dDms;//十进制角度及度分秒格式角度,控制变量 //用于存放度分秒三个值的变量 intiDegree,iMin; doubledSec; doubledTmp; dDeg=Rad*180/PI;//弧度转化为度 //度转化成度分秒iDegree=int(dDeg); dTmp=(dDeg-iDegree)*60; iMin=int(dTmp); dSec=(dTmp-iMin)*60; dDms=iDegree+double(iMin)/100+dSec/10000; returndDms; }voidCTriAzimuthDlg::OnBnClickedButton1(){ //TODO:在此添加控件通知处理程序代码 UpdateData(TRUE); doubledx,dy; doubleRad;//弧度,控制变量 dx=X2-X1; dy=Y2-Y1; if(dx>0) { if(dy>0) Rad=atan(dy/dx);//A为第一象限角 elseif(dy<0) Rad=atan(dy/dx)+2*PI;//A为第四象限角 else Rad=0;//A=0度 } elseif(dx<0) { if(dy>0) Rad=atan(dy/dx)+PI;//A为第二象限角 elseif(dy<0) Rad=atan(dy/dx)+PI;//A为第三象限角 else Rad=180;//A=180度 } else { if(dy>0) Rad=90;//A=90度 elseif(dy<0) Rad=270;//A=270度 else MessageBox(_T("两点重合,无方位角")); } A=Rad_To_Dms(Rad);//将弧度转化为度分秒形式 UpdateData(FALSE);}运行结果:输入两点坐标之后,单击计算,可得方位角,以上方位角表示的是45°00′0000276342″空间直角坐标系与大地坐标系的相互转换设计思路:大地坐标系转化为笛卡尔坐标系:首先通过的长半径a和扁率α求出偏心率e和卯酉圈曲率半径N;再根据以下公式可求得笛卡尔坐标。X=(N+H)cosBcosLY=(N+H)cosBcosLZ=[N(1-e*e)+H]sinB笛卡尔坐标系转化为大地坐标系:过程见流程图的长半径a和扁率α的长半径a和扁率α求偏心率e求偏心率e输入笛卡尔坐标X、Y、Z输入笛卡尔坐标X、Y、ZB_Rad(B的弧度)赋值为0.0B_Rad(B的弧度)赋值为0.0将变量H的值赋给H0将变量H的值赋给H0True依次求出N,B_Rad,,H,dH(dH=H-H0)依次求出N,B_Rad,,H,dH(dH=H-H0)dH>0.00001dH>0.00001false求得B_Rad及H求得B_Rad及H根据X、Y的符号和反正切公式求出根据X、Y的符号和反正切公式求出L_Rad将L_Rad、B_Rad将L_Rad、B_Rad转化为度分秒形式输出L、B、H输出L、B、H界面设计:界面由6个文本框、6个静态框和4个命令按钮组成〔具体见运行结果〕主要代码:列出程序的代码,按文件依次列出。注意代码的书写格式和注释文件ConCoordinateDlg.cpp#include"stdafx.h"#include"ConCoordinate.h"#include"ConCoordinateDlg.h"#include"math.h"……voidCConCoordinateDlg::OnBnClickedCancel(){ //TODO:在此添加控件通知处理程序代码 OnCancel();}constdoublea=6378137.0;//椭球长半径aconstdoublef=1/298.257223563;//扁率fconstdoublePI=3.1415926;voidCConCoordinateDlg::OnBnClickedOk(){ //TODO:在此添加控件通知处理程序代码 L=0; B=0; H=0; X=a; Y=0; Z=0; UpdateData(FALSE); //OnOK();}//将弧度转化成度分秒形式doubleRad_To_Dms(doubleRad){ doubledDeg,dDms;//十进制角度及度分秒格式角度,控制变量 //用于存放度分秒三个值的变量 intiDegree,iMin; doubledSec; doubledTmp; dDeg=Rad*180/PI;//弧度转化为度 //度转化成度分秒iDegree=int(dDeg); dTmp=(dDeg-iDegree)*60; iMin=int(dTmp); dSec=(dTmp-iMin)*60; dDms=iDegree+double(iMin)/100+dSec/10000; returndDms; }//将度分秒形式转化为弧度doubleDms_To_Rad(doubledDms){ intiDegree,iMin; doubledSec;//分别用于存放度、分、秒值的变量 doubledDeg;//十进制角度,控制变量doubledRad;//弧度 iDegree=int(dDms);//截取度 iMin=int((dDms-iDegree)*100);//截取分dSec=((dDms-iDegree)*100-iMin)*100;//获取秒dDeg=iDegree+double(iMin)/60+dSec/3600;//先把分秒转化成度,再相加dRad=dDeg*PI/180;//转化为弧度 returndRad;}voidCConCoordinateDlg::OnBnClickedButton1(){ //TODO:在此添加控件通知处理程序代码 UpdateData(TRUE);//将度分秒转化成弧度 doubleL_Rad,B_Rad;//弧度 //将度分秒转化为弧度L_Rad=Dms_To_Rad(L); B_Rad=Dms_To_Rad(B); doublee,N;//定义椭球偏心率e和卯酉圈曲率半径N e=sqrt(2*f-f*f); N=a/sqrt(1-e*e*sin(B_Rad)*sin(B_Rad)); X=(N+H)*cos(B_Rad)*cos(L_Rad);Y=(N+H)*cos(B_Rad)*sin(L_Rad); Z=(N*(1-e*e)+H)*sin(B_Rad); UpdateData(FALSE);}voidCConCoordinateDlg::OnBnClickedButton2(){ //TODO:在此添加控件通知处理程序代码 UpdateData(TRUE); doubleL_Rad; doubleB_Rad=0.0;//弧度 doublee,N;//定义椭球偏心率e和卯酉圈曲率半径N doubleH0;//循环中存储上一个H的变量 doubledH;//储存H增量值的变量 e=sqrt(2*f-f*f); do//迭代循环求H及B { H0=H; N=a/sqrt(1-e*e*sin(B_Rad)*sin(B_Rad));B_Rad=atan(Z/sqrt(X*X+Y*Y)/(1-e*e*N/(N+H))); H=sqrt(X*X+Y*Y)/cos(B_Rad)-N; dH=H-H0; }while(fabs(dH)>0.00001); B=Rad_To_Dms(B_Rad);//求B if(Y>0)//分情况讨论经度 { if(X>0) L_Rad=atan(Y/X); elseif(X<0) L_Rad=atan(Y/X)+PI; else L_Rad=PI/2; } elseif(Y<0) { if(X>0) L_Rad=atan(Y/X); elseif(X<0) L_Rad=atan(Y/X)-PI; else L_Rad=-PI/2; } else { if(X>0) L_Rad=0; elseif(X<0) L_Rad=PI; else MessageBox(_T("该点在地轴上")); } L=Rad_To_Dms(L_Rad);//求L UpdateData(FALSE); }运行结果:如下图,输入笛卡尔坐标X、Y、Z,单击“笛卡尔转大地”即可获得大地坐标L、B、H。同理输入大地坐标,单击“大地转笛卡尔”即可获得笛卡尔坐标。设计技巧:这个程序存在大量角度的转换,既需要将弧度化成度分秒,有需要将度分秒化成弧度,因此可事先为它们分别编写函数,程序中遇到坐标转换就可以直接调用,方便简洁。前方交会计算设计思路:程序中设计度分秒形式与弧度的转换,可以编写一个将度分秒转化为弧度的函数函数,将观测值转化为弧度形式。具体步骤为=1\*GB3①调用将度分秒转化为弧度的函数将观测角度转化为弧度②根据三个点坐标计算⊿ABC的三条边长a,b,c③由余弦定理分别求得角A、B、C的弧度值④对求得的六个弧度求正切值。⑤求分别三个一直点的权值⑥求出P点坐标界面设计:控件比拟多,有11个文本框、11个静态框和2个命令按钮。〔具体界面见运行结果的截图〕主要代码:列出程序的代码,按文件依次列出。注意代码的书写格式和注释文件ResectionDlg.cppvoidCResectionDlg::OnBnClickedCancel(){ //TODO:在此添加控件通知处理程序代码 OnCancel();}voidCResectionDlg::OnBnClickedOk(){ //TODO:在此添加控件通知处理程序代码 OnOK();}constdoublePI=3.1415926;//将度分秒形式转化为弧度doubleDms_To_Rad(doubledDms){ intiDegree,iMin; doubledSec;//分别用于存放度、分、秒值的变量 doubledDeg;//十进制角度,控制变量doubledRad;//弧度 iDegree=int(dDms);//截取度 iMin=int((dDms-iDegree)*100);//截取分dSec=((dDms-iDegree)*100-iMin)*100;//获取秒dDeg=iDegree+double(iMin)/60+dSec/3600;//先把分秒转化成度,再相加dRad=dDeg*PI/180;//转化为弧度 returndRad;}voidCResectionDlg::OnBnClickedButton2(){ //TODO:在此添加控件通知处理程序代码 UpdateData(TRUE); doublea,b,c;//边长 doubleA,B,C;//存储三个内角值的变量 doublePa,Pb,Pc;//权值变量 doubleRadP1,RadP2,RadP3;//三个观测角的弧度转化值 RadP1=Dms_To_Rad(P1); RadP2=Dms_To_Rad(P2); RadP3=Dms_To_Rad(P3);//P1,P2,P3为观测角//求三角形边长 a=sqrt((Xc-Xb)*(Xc-Xb)+(Yc-Yb)*(Yc-Yb)); b=sqrt((Xc-Xa)*(Xc-Xa)+(Yc-Ya)*(Yc-Ya)); c=sqrt((Xb-Xa)*(Xb-Xa)+(Yb-Ya)*(Yb-Ya)); //求三角形三内角 A=acos((b*b+c*c-a*a)/(2*b*c)); B=acos((a*a+c*c-b*b)/(2*a*c)); C=acos((a*a+b*b-c*c)/(2*a*b)); //求权值 Pa=tan(RadP1)*tan(A)/(tan(RadP1)-tan(A)); Pb=tan(RadP2)*tan(B)/(tan(RadP2)-tan(B)); Pc=tan(RadP3)*tan(C)/(tan(RadP3)-tan(C));//求待测点坐标 Xp=(Pa*Xa+Pb*Xb+Pc*Xc)/(Pa+Pb+Pc); Yp=(Pa*Ya+Pb*Yb+Pc*Yc)/(Pa+Pb+Pc); UpdateData(FALSE);}运行结果:输入三个点坐标及按个观测角度值,单击“计算”即显示出P点坐标。总结这次试验内容很多,三个程序涵盖了顺序结构、选择结构和循环结构。试验过程中遇到了许多问题,通过不断的发现问题、解决问题,编程的根本功在一点点加强。在试验之前,老师对相关原理进行了讲解,实验指导书给出的计算方法、公式都很详实,所以在逻

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论