1、四、主要代码如下:#include void CMy006Dlg:OnBnClickedButton1() / TODO: 在此添加控件通知处理程序代码 /判断输入是否有误并计算 UpdateData(TRUE); if(a+bc&a+cb&b+ca) double t; t=(a+b+c)/2; s=sqrt(t*(t-a)*(t-b)*(t-c); else CMy006Dlg:OnBnClickedButton2();/输入的三边不能构成三角形时则清零 UpdateData(FALSE);OnBnClickedButton2() /清除功能 a=0; b=0; c=0; s=0;OnBn
2、ClickedButton3() exit(0);/退出功能五、运行结果如下:六、实验总结本次实验比较简单,主要是熟悉一下Virsual Studio 2008的MFC编程环境,了解编译MFC项目的整个流程。总的来说问题不大,只是有时候因为搞错顺序而导致程序无法运行,如先添加了代码才发现没有绑定变量尔后才绑定,或者变量属性搞错等等,都会是程序运行出错,还好有老师指点迷津。另外一点就是,在实现了上述内容以后,如何去优化、美化界面的问题,还有程序的完美性问题也是值得考虑的。因为是面向对象的程序,所以程序运行中可能会出现的问题都要考虑周全了,如题中,如果输入的三边不能构成一个三角形要如何等等。总的来
3、说实验比较成功,收获很大。实验二 控制结构程序设计(方位角计算、坐标转换、后方交会)1、编写一个方位角计算程序;2、设计同一参考椭球下的三维地心坐标(笛卡尔坐标系)与大地坐标系转换的程序;式中,B,L,H为椭球面上的大地维度,大地经度,大地高;X、Y、Z为空间直角坐标;N为卯酉圈曲率半径,e为椭球的偏心率,a为椭球的长半径,b为椭球的短半径。(WGS84椭球参数:长半径a-6378137m,扁率=1、298.257223563)3、编写一个后方交会计算程序:基本原理及计算公式:若将Pa,Pb,Pc看成权,则P点的坐标即为三个已知点的加权平均值1、方位角计算:A、窗体上应有四个静态框加文本框用于
4、输入已知点的坐标,还要一个静态框加文本框用于输出方位角,还要三个命令按钮用于计算、清除和退出;B、已知两点坐标,求所在线段的方位角,可以用正弦、余弦和正切公式,在这里我选择用正切公式;C、求出dx和dy之后,求可以求出角度,但是在不同的象限里的方位角有可能得到相同的正切值,所以要加以判断,用if 语句,然后就可以求出确切的方位角了。2、坐标转换:A、窗体上要有六个静态框加文本框用于输入或输出大地坐标或者空间坐标,还有三个命令按钮用于计算、清除和退出,可以加两个静态提示框;B、笛卡尔坐标转换成大地坐标,用到的是一个迭代公式,当精度达到要求时跳出循环,所以用do while循环,将H的初始值设为0
5、;大地坐标转化笛卡尔坐标比较简单,将公式写成代码就可以了;两个转换须注意度分秒和弧度的转换;3、后方交会:A、窗体上应有六个静态框加文本框用以输入已知点坐标,三个静态框加文本框用以输入测得的角度,两个静态框加文本框用以输出待定点坐标,三个按钮用于计算、清除和退出;B、已知三点坐标求待定点坐标,根据赫尔默特公式,要知道三角形三个内角,内角可以根据方位角来求,方位角可用正切公式求得。故分为三步,第一先求各边方位角,第二步根据方位角和内角的关系求三个内角,第三步根据内角和测量得到的,求权,接下来就可以根据公式求出待定点坐标了;要注意三个已知点是否位于危险圆上;须注意度分秒和弧度的转换;C、在文本框中
6、绑定相应的变量,在按钮中输入相应的代码,调试并运行。方位角计算界面:坐标转换界面:后方交会界面:#define PI 3.14159265358979323846void CMy007Dlg: double dx,dy,A; dx=x2-x1; dy=y2-y1; A=atan(dy/dx); if(dx0) if(dy fang=A; else if(dy fang=2*PI+A; else fang=0; else if(dx=1e-5) L=atan(y/x)*180/PI; else L=0; if(x L=L; else if(x0) /计算经度 L=L+180; else L=L-
7、180; if(fabs(x)=(1e-5)|(fabs(y)=(1e-5) B=atan(z/sqrt(x*x+y*y); H=0; do N=a/sqrt(1-e*e*sin(B)*sin(B); H0=sqrt(x*x+y*y)/cos(B)-N; B=atan(z/(sqrt(x*x+y*y)*(1-e*e*N/(N+H); /迭代运算得到H,B dH=H0-H; H=H0; while(fabs(dH)=(1e-5); /当H的精度达到.00001时跳出循环 B=0; N=a/sqrt(1-e*e*sin(B)*sin(B); H=sqrt(x*x+y*y)/cos(B)-N; B=
8、B*180/PI; B=B+(1e-10); L=L+(1e-10); D=int(B); D1=int(L); B2=(B-D)*60; /弧度转换成度分秒格式 L2=(L-D1)*60; M=int(B2); M1=int(L2); S=(B2-M)*60; S1=(L2-M1)*60; B=D+M/100+S/(1e4); L=D1+M1/100+S1/(1e4); double b,l,b1,l1; double S,S1; D= int(B); D1 = int(L); M = int(B - D) * 100); M1= int(L - D1) * 100); S = (B-D)
9、* 100 - M) * 100; S1 = (L-D1) * 100 - M1) * 100; b1= D+ M / 60 + S / 3600; /度分秒转化为弧度 l1= D1 + M/ 60 + S1 / 3600; b=(b1/180)*PI; l=(l1/180)*PI; N=a/sqrt(1-e*e*sin(b)*sin(b); x=(N+H)*cos(b)*cos(l); /大地测量坐标转化为笛卡尔坐标 y=(N+H)*cos(b)*sin(l); z=(N*(1-e*e)+H)*sin(b);OnBnClickedButton4() x=0; y=0; z=0; L=0; B
10、=0; H=0;后方交会:void CMy23Dlg: XA=0; YA=0; XB=0; YB=0; XC=0; YC=0; be=0; ga=0; XP=0; YP=0; /后方交会 int D, M; double dS; double a1,be1,ga1; double a2,be2,ga2; double aAB,aAC,aBC,aBA,aCA,aCB,A,B,C,PA,PB,PC; D = int(a); M = int(a-D)*100); dS = (a-D)*100-M)*100; a1 = D+M/60+dS/3600; a2=a1*PI/180; D = int(be)
11、; M= int(be - D)*100); dS = (be- D) * 100 -M) * 100; be1= D+M/ 60 + dS / 3600; be2=be1*PI/180; D = int(ga); M= int(ga - D) * 100); dS= (ga- D) * 100 - M) * 100; ga1=D+ M/ 60 + dS/ 3600; ga2=ga*PI/180; aAB=atan(YB-YA)/(XB-XA); aAC=atan(YC-YA)/(XC-XA); /计算各边方位角 aBC=atan(YC-YB)/(XC-XB); aBA=(aAB180?aAB
12、-180:aAB+180); aCA=(aACaAC-180:aAC+180); aCB=(aBCaBC-180:aBC+180); A=aAB-aAC; B=aBC-aBA; /计算各内角 C=aCA-aCB; if(a+be+C)190) /判断是否危险园,否则进行计算 PA=(tan(a2)*tan(A)/(tan(a2)-tan(A); PB=(tan(be2)*tan(B)/(tan(be2)-tan(B); PC=(tan(ga2)*tan(C)/(tan(ga2)-tan(C); XP=(PA*XA+PB*XB+PC*XC)/(PA+PB+PC); YP=(PA*YA+PB*YB
13、+PC*YC)/(PA+PB+PC); else MessageBox(_T(该点位于危险圆上);五、运行结果本次实验有三个小实验,现在做完了,也不觉得是很难的事。有了上一次实验的经验,MFC制作流程是很熟悉了。主要是计算按钮里的代码。写代码也不是难事,把公式写出来就是了,注意一下该注意的,比如不同象限里的方位角会有一样的正切值,度分秒与弧度的相互转换,危险圆等等,也不是很困难。难就难在将代码码进去调试。我算是比较粗心的一个人,总有一些小问题没有被发现,跌跌撞撞调试到现在才算完成。可能装的软件有些问题,0错误0警告的时候还是要运行第二遍才成功,第一遍可是直接停止工作了。实验中用得比较多的语句是if 语句,这次用了一次do while循环,对于我这种基础不甚牢靠的人来说,又是一个挑战。再请教了各路高手之后,我终于还是完成了,有种柳暗花明的感觉。 友情提示:范文可能无法思考和涵盖全面,供参考!最好找专业人士起草或审核后使用,感谢您的下载!
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1