测绘程序设计四-函数实验报告《测绘程序设计()》上机实验报告(Visual C++.Net)班级:测绘1402学号: ***********名:***序号: sm_207二零一六年五月实验4 函数一、实验目的•掌握函数的定义、引用及应用方法。
二、实验内容1.交会定点计算函数设计把前方交会、测边交会、后方交会程序写成函数的形式,然后再通过主程序调用。
提示:后方交会计算函数设计思路(1)基本原理及计算公式。
若将Pa、Pb、Pc看成权,则P点的坐标即为三个已知点的加权平均值(2)计算程序设计步骤①设计界面,用于输入3个已知点的坐标和三个观测角α、β和γ,以及用于输出待定点坐标的文本框(12个)、静态标签框和Button 按钮; ②定义文本框控件变量(Value );③创建后方交会定点计算函数,函数的输入为三个观测角和三个已知点的坐标,输出为待定点坐标,输出可以用引用参数的方式输出,具体计算步骤;a.根据已知点计算三个内角A 、B 、C ;b.计算Tan(α)、Tan(β)、Tan(γ)、Tan(A)、Tan(B)、Tan(C);c.计算Pa 、Pb 、Pc ;d.计算待定点坐标Xp 、Yp 。
④创建“计算”Button 按钮的Click 事件函数,在该事件函数中调用后方交会计算函数,并在相应的文本框中显示计算结果。
2.高斯投影正反算计算函数设计编写高斯投影正算与反算的两个函数,并设计简单界面对函数计算的正确性进行测试。
正算公式:⎪⎪⎪⎪⎪⎩⎪⎪⎪⎪⎪⎨⎧''-++-''+''+-''+''''=''+-''+''++-''+''''+=52224255322336425644223222)5814185(cos 120)1(cos 6cos )5861(cos sin 720)495(cos sin 24cos sin 2l t t t B N l t B N l B N y l t t B B N l t B B N l B B N X x ηηρηρρρηηρρBe cos '=ηBe a N 22sin 1-=tant B =ab a e 22-=bb a e 22-='反算公式:a e长半轴第一偏心率⎪⎪⎪⎪⎪⎩⎪⎪⎪⎪⎪⎨⎧+++++++-=++--+++-=5222425322364254222232)8624285(cos1201)21(cos61cos1)459061(720)935(242ytttBNytBNyBNlyttNMtyttNMtyNMtBBfffffffffffffffffffffffffffffηηηηηlfB是要求的点到中央子午线的经度差,为底点纬度下标“f”表示与fB有关量fff BeNM22cos1'+=ffBeaN22sin1-=ffBe cos'=ηffBt tan=X 即,y=0时x所对应道的子x午弧长界面设计:控件类型控件ID 控件名称变量函数EditControl IDC_EDITx1 x1 EditControl IDC_EDITx2 x2 EditControl IDC_EDITy1 y1 EditControl IDC_EDITy2 y2 EditControl IDC_EDITDap Dap EditControl IDC_EDITDbp Dbp EditControl IDC_EDITxp xp EditControl IDC_EDITyp yp EditControl IDC_EDITX1 X1 EditControl IDC_EDITX2 X2 EditControl IDC_EDITY1 Y1 EditControl IDC_EDITY2 Y2 EditControl IDC_EDITalpha a EditControl IDC_EDITbetta b EditControl IDC_EDITXp Xp主要代码:double PI=3.1415926;double EPSILON=1.0E-10;void FowardIntersection(double Xa1,doubleYa1,double Xb1,double Yb1,double a,doubleb,double& Xp1,double& Yp1) //前方交会函数{double cota=1/tan(a);double cotb=1/tan(b);Xp1=(Xa1*cotb+Xb1*cota+Yb1-Ya1)/(cota+cotb );Yp1=(Ya1*cotb+Yb1*cota+Xa1-Xb1)/(cota+cotb );}void SideIntersection(double Xa2,doubleYa2,double Xb2,double Yb2,double Dap,double Dbp,double& Xp2,double& Yp2) //侧方交会函数{double dx=Xb2-Xa2;double dy=Yb2-Ya2+EPSILON;//计算AB方位角(弧度制)double angleAB;if(dy>=0){angleAB=0.5*PI-atan(dx/dy);}else{angleAB=1.5*PI-atan(dx/dy);}//计算角Adouble Dab; //AB边长double A; //角Adouble angleAP; //方位角APDab=sqrt((Xb2-Xa2)*(Xb2-Xa2)+(Yb2-Ya2)*(Yb 2-Ya2));A=acos((Dab*Dab+Dap*Dap-Dbp*Dbp)/(2*Dab*Da p));angleAP=angleAB-A;Xp2=Xa2+Dap*cos(angleAP);Yp2=Ya2+Dap*sin(angleAP);}void Csqz2Dlg::OnBnClickedCancle()//清空数据UpdateData(true);X1=0;Y1=0;X2=0;Y2=0;a=0;b=0;Xp=0;Yp=0;x1=0;y1=0;x2=0;y2=0;Dap=0;Dbp=0;xp=0;yp=0;UpdateData(false);}void Csqz2Dlg::OnBnClickedOk2()//进行侧方交会计算UpdateData(true);SideIntersection(x1,y1,x2,y2,Dap,Dbp,xp,yp ); //调用函数UpdateData(false);}void Csqz2Dlg::OnBnClickedOk()//进行前方交会计算{UpdateData(true);FowardIntersection(X1,Y1,X2,Y2,a,b,Xp,Yp); //调用函数UpdateData(false);}double Pxy(double x,double y) //计算x,y的函数{double P;P=(tan(x)*tan(y))/(tan(x)-tan(y));return P;}void CsqzDlg::OnBnClickedOk()//进行后方交会的计算{UpdateData(TRUE);double Pa;double Pb;double Pc;double a,b,c,A,B,C;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))*180/3.141592 6;B=acos((a*a+c*c-b*b)/(2*a*c))*180/3.141592 6;C=acos((b*b+a*a-c*c)/(2*b*a))*180/3.1415926;if(alpha+betta+C<170||alpha+betta+C>190)//判断危险圆{Pa=Pxy(alpha,A);Pb=Pxy(betta,B);Pc=Pxy(gamma,C);XP=(XA*Pa+XB*Pb+XC*Pc)/(Pa+Pb+Pc);YP=(YA*Pa+YB*Pb+YC*Pc)/(Pa+Pb+Pc);}elseMessageBox(_T("该点位于危险圆上"));UpdateData((FALSE);}#include"math.h"double PI=3.1415926; //一些常数的定义double p2=206265;double a=6378140.0;double b=6356755.2881575287;double e=(sqrt(a*a-b*b))/a;double e1=(sqrt(a*a-b*b))/b;double dmstodgree(double dmg)//度分秒转换成度{double dge;int Dgree;int Min;int Secend;Dgree=int(dmg);//截取度的整数部分 Min=int((dmg-Dgree)*100);//截取分的部分Secend=int((dmg-Dgree)*100-Min)*100;//截取秒的部分dge=Dgree+(Min/60)+(Secend/3600);//将度分秒转换为度return dge;//返回度}double dgreetodms(double drg)//度转换成度分秒{double dge;int Dgree;int Min;int Secend;Dgree=int(drg);//截取度的整数部分Min=int((drg-Dgree)*60);//截取分的整数部分Secend=int(((drg-Dgree)*60-Min)*60);//截取秒的整数部分dge=Dgree+Min/100+Secend/10000;//将度转换成度分秒return dge;//返回度分秒}double caculateS(double B) //计算X{doubleA0=1+3/4*e*e+45/64*pow(e,4)+350/512*pow(e,6)+ 11025/16384*pow(e,8);doubleA2=-1/2*(3/4*e*e+60/64*pow(e,4)+525/512*pow(e ,6)+17640/16384*pow(e,8));doubleA4=1/4*(15/64*pow(e,4)+210/512*pow(e,6)+8820/ 16384*pow(e,8));doubleA6=-1/6*(35/512*pow(e,6)+2520/16384*pow(e,8)) ;double A8=1/8*(315/16384*pow(e,8));doubleS=a*(1-e*e)*(A0*B+A2*sin(2*B)+A4*sin(4*B)+A6*sin(6*B)+A8*sin(8*B));return S;}double caculateBf(double X) //计算Bf {doubleA0=1+3/4*e*e+45/64*pow(e,4)+350/512*pow(e,6)+ 11025/16384*pow(e,8);double B0=caculateS(X)/(a*(1-e*e)*A0);doublek0=1/2*(3/4*e*e+45/64*pow(e,4)+350/512*pow(e, 6)+11025/16384*pow(e,8));doublek2=-1/3*(63/64*pow(e,4)+1108/512*pow(e,6)+582 39/16384*pow(e,8));doublek4=1/3*(604/512*pow(e,6)+68484/16384*pow(e,8) );double k6=-1/3*(26328/16384*pow(e,8));doubleBf=B0+sin(2*B0)*(k0+sin(B0)*sin(B0)*(k2+sin(B 0)*sin(B0)*(k4+k6*sin(B0)*sin(B0))));return Bf;}void coordinatecalculate(double B,doubleL,double n,double &X,double&Y) //正算{double dl=dmstodgree(L);double N=dmstodgree(n);double l=(dl-N)*3600/206265;double b=dmstodgree(B)*PI/180;double n1=e1*cos(b);double t=tan(b);double N1=a/sqrt(1-e*e*sin(b)*sin(b));double l2=abs(l-(int(l)*6-3))*3600;//经度L同当前子午线的差值单位为秒double s=p2*p2*p2*p2;double v=l2*l2*l2*l2;double u=cos(b)*cos(b)*cos(b);X=caculateS(X)+N1/(2*(p2)*(p2))*sin(b)*cos (b)*(l2)*(l2)+N/(24*(p2)*(p2))*sin(b)*u*(5-t* t+9*n1*n1+4*n1*n1*n1*n1)*v+N1/(720*p2*p2*s)*s in(b)*cos(b)*cos(b)*u*(61-58*t*t+t*t*t*t)*l2* l2*v;Y=N1/(p2)*cos(b)*(l2)+N*p2/(6*s)*u*(1-t*t+ n*n)*v/l2+N1/(120*p2*s)*cos(b)*cos(b)*u*(5-18 *t*t+t*t*t*t-58*n1*n1*t*t)*l2*v;}void coordinateinversecalculation(doubleX,double Y,double n,double &B,double &L) //反算{ double Bf=caculateBf(X);double x=X;double Tf=tan(Bf);double nf=e1*cos(Bf);double Nf=a/sqrt(1-e*e*sin(Bf)*sin(Bf));double Mf=Nf/(1+e1*e1*cos(Bf)*cos(Bf));double g=Nf*Nf*Nf*Nf;double h=Y*Y*Y*Y;double c=Tf*Tf*Tf*Tf;doubleb=Bf-Tf/(2*Mf*Nf)*Y*Y+Tf/(24*Mf*pow(Nf,3))*(5 +3*Tf*Tf+nf*nf-9*nf*nf*Tf*Tf)*h-Tf/(720*Mf*po w(Nf,5))*(61+90*Tf*Tf+45*c)*h*Y*Y;doublel=1/(Nf*cos(Bf))*Y-Nf/(6*g*cos(Bf))*(1+2*Tf*Tf+nf*nf)*h/Y+1/(120*Nf*g*cos(Bf))*(5+28*Tf*Tf +24*c+6*nf*nf+8*nf*nf*Tf*Tf)*h*Y;l=l+n;B=dmstodgree(b); //转换L=dmstodgree(l);}void qingchu(double X,double Y,double n,double B,double L) //清除{X=0;Y=0;n=0;B=0;L=0;}voidCCalculationofcoordinateDlg::OnBnClickedCoord inate()//正算{UpdateData(true);coordinatecalculate(B,L,n,X,Y); //调用正算函数UpdateData(false);}voidCCalculationofcoordinateDlg::OnBnClickedInver se()//反算{UpdateData(true);coordinateinversecalculation(X,Y,n,B,L); //调用反算函数UpdateData(false);}voidCCalculationofcoordinateDlg::OnBnClickeddelet e()//清除{UpdateData(true);qingchu(X,Y,n,B,L);UpdateData(false);}voidCCalculationofcoordinateDlg::OnBnClickedCance l()//退出{OnCancel(); }计算结果总结次实验虽然思维不复杂,但是因为高斯投影正反算公式比较复杂,导致工作量有点大,但还是顺利完成了。