《测绘程序设计()》上机实验报告(Visual C++.Net)班级:学号:姓名:序号:二零一零年四月实验7 常用测量程序设计一、实验目的∙巩固类的创建与使用∙掌握数组参数的传递∙掌握常用测绘程序设计的技巧二、实验内容编写高斯投影正、反算程序设计思路基于对话框的设计,添加两个头文件分别是Angle和Gauss ,在角度类中添加角度类的函数,角度类的函数我用了老师的例子,因为我以前写的那个角度类,定义的存贮角度类型的值是一个变量,引用起来不好用。
然后就是在Gauss的头文件和cpp中添加代码,我一共定义了四个函数,分别是高斯正算,求X的一个函数,高斯反算,求Bf的一个函数。
定义完类之后,就在界面上引用函数即可。
主要代码Gauss.h#pragma onceclass Gauss{/*double a;double b;*///double e=sqrt(a*a-b*b)/a;//double _e=sqrt(a*a-b*b)/b;public:/*Gauss(double a1,double b1);*/Gauss(void);~Gauss(void);public:void CGaussForward(double dB,double dL,double dCML,int type,double &x,double &y);double ComptX(double dB);void CGaussInverse(double x, double y, double dCML,int type, double &dB, double &dL);double ComptBf(double x);void ellipd(int type);};Gauss.cpp#include"StdAfx.h"#include"Gauss.h"#include"math.h"#include"Angle.h"const double PI=4.0*atan(1.0);double a=6378245.0;double b=6356863.0187730473;//初始化double e=sqrt(a*a-b*b)/a;double _e=sqrt(a*a-b*b)/b;/*Gauss::Gauss(double a1=6378245.0,double b1=6356863.0187730473){a=a1;b=b1;}*///Gauss::Gauss(double a1, double b1)//{ a1=6378245.0;// b1=6356863.0187730473;// a=a1;// b=b1;// /*double e=sqrt(a*a-b*b)/a;//double _e=sqrt(a*a-b*b)/b;*///}Gauss::Gauss(void){}Gauss::~Gauss(void){}void Gauss::ellipd(int type){if(type==1) //克拉索夫斯基椭球{a=6378245.0;b=6356863.0187730473;//e=sqrt(0.006693421622966);}else if(type==2) //1975国际协议椭球{a=6378140.0;b=6356755.2881575287;//e=sqrt(0.006694384999588);}else if(type==3) //WGS-84椭球{a=6378137.0;b=6356752.3142;//e=sqrt(0.0066943799013);}}void Gauss::CGaussForward(double dB,double dL,double dCML,int type,double &x,double &y) {CAngle B(dB);CAngle L(dL);CAngle CML(dCML);CAngle _L(L-CML); //计算经差dB=B(RAD);ellipd(type);//设置椭球参数//double fengdai(type);//投影带double l=_L(RAD);double N=a/sqrt(1-e*e*sin(dB)*sin(dB));double t=tan(dB);double Eta=_e*cos(dB);double X=ComptX(dB);//double Rou;//Rou=180*3600/PI;x=X+N/2*sin(dB)*cos(dB)*l*l+N/24*sin(dB)*pow(cos(dB),3)*(5-t*t+9*Eta*Eta+4*pow(Eta,4))*pow(l,4)+N/720*sin(dB)*pow(cos(dB),5)*(61-58*t*t+pow(t,4))*pow(l,6);//+N*sin(dB)*cos(dB)*l*l/2//+N*sin(dB)*pow(cos(dB),3)*(5-t*t+9*Eta*Eta+4*pow(Eta,4))*pow(l,4)/24;// //+N/(720*pow(Rou,6))*sin(RadB)*pow(cos(RadB),5)*(61-58*t*t+pow(t,4))*pow(l,6);//+N*sin(dB)*pow(cos(dB),5)*(61-58*t*t+pow(t,4))*pow(1,6)/720;y=N*cos(dB)*l+N/6*pow(cos(dB),3)*(1-t*t+Eta*Eta)*pow(l,3)+N/120*pow(cos(dB),5)*(5-18*t*t+pow(t,4)+14*Eta*Eta-58*Eta*Eta*t*t)*pow(l,5)+500000;//+N*cos(dB)*l//+N*pow(cos(dB),3)*(1-t*t+Eta*Eta)*pow(1,3)/6//+N*pow(cos(dB),5)*(5-18*t*t+pow(t,4)+14*Eta*Eta-58*pow(Eta*t,2))*pow(l,5)/120;//dX=Round(dX,4);//dY=Round(dY,4);}double Gauss::ComptX(double dB){double A0=1+3/4*e*e+45/64*pow(e,4)+350/512*pow(e,6)+11025/16384*pow(e,8);const double A2=-1/2*(3/4*e*e+60/64*pow(e,4)+525/512*pow(e,6)+17640/16384*pow(e,8));const double A4=1/4*(15/64*pow(e,4)+210/512*pow(e,6)+8820/16384*pow(e,8));const double A6=-1/6*(35/512*pow(e,6)+2520/16384*pow(e,8));// const double A6=-1/6*(35/512*pow(e,6)+2520/16384*pow(e,8));const double A8=1/8*(315/16384*pow(e,8));double X= a*(1-e*e)*(A0*dB+A2*sin(2*dB)+A4*sin(4*dB)+A6*sin(6*dB)+A8*sin(8*dB));return X;}void Gauss::CGaussInverse(double x, double y, double dCML,int type, double &dB, double &dL) {ellipd(type);//设置椭球参数double Bf=ComptBf(x);double tf=tan(Bf);double Etaf=_e*cos(Bf);double Nf=a/sqrt(1-e*e*sin(Bf)*sin(Bf));double Mf=Nf/(1+_e*_e*cos(Bf)*cos(Bf));y=y-500000;dB=Bf-tf/(2*Mf*Nf)*y*y+tf/(24*Mf*pow(Nf,3))*(5+3*tf*tf+Etaf*Etaf-9*Etaf*Etaf*tf*tf)*pow(y,4)-tf/(720*Mf*pow(Nf,5))*(61+90*tf*tf+45*pow(tf,4))*pow(y,6);double l=1/(Nf*cos(Bf))*y-1/(6*pow(Nf,3)*cos(Bf))*(1+2*tf*tf+Etaf*Etaf)*pow(y,3)+1/(120*pow(Nf,5)*cos(Bf))*(5+28*tf*tf+24*pow(tf,4)+6*Etaf*Etaf+8*Etaf*Etaf*tf*tf)*pow( y,5);CAngle B(dB,RAD);CAngle _L(l,RAD);CAngle CML(dCML);CAngle L(CML+_L);dB=B(DMS);dL=L(DMS);}double Gauss::ComptBf(double x){double A0;A0=1+3.0/4*e*e+45.0/64*pow(e,4)+350.0/512*pow(e,6)+11025.0/16384*pow(e,8);double B0=x/(a*(1-e*e)*A0);const doubleK0=1.0/2*(3.0/4*e*e+45.0/64*pow(e,4)+350.0/512*pow(e,6)+11025.0/16384*pow(e,8));const double K2=-1.0/3*(63.0/64*pow(e,4)+1108.0/512*pow(e,6)+58239.0/16384*pow(e,8));const double K4=1.0/3*(604.0/512*pow(e,6)+68484.0/16384*pow(e,8));const double K6=-1.0/3*(26328.0/16384*pow(e,8));doubleBf=B0+sin(2*B0)*(K0+sin(B0)*sin(B0)*(K2+sin(B0)*sin(B0)*(K4+K6*sin(B0)*sin(B0))));return Bf;}Shiyan_7Dlg.cpp#include"stdafx.h"#include"shiyan_7.h"#include"shiyan_7Dlg.h"#include"Gauss.h"#include"Angle.h"void Cshiyan_7Dlg::OnBnClickedOk(){// TODO: 在此添加控件通知处理程序代码UpdateData(TRUE);Gauss D;D.CGaussForward(B, L, CML,type, X,Y);UpdateData(FALSE);//OnOK();}void Cshiyan_7Dlg::OnBnClickedOk2(){// TODO: 在此添加控件通知处理程序代码UpdateData(TRUE);Gauss DB;DB.CGaussInverse(X,Y,CML,type,B,L);UpdateData(FALSE);}Angle.h#pragma onceenum AngleStyle{DEG,DMS,RAD};class CAngle{public:CAngle(double value=0,AngleStyle style=DMS);~CAngle(void);private:double dValue;//角度值AngleStyle nCurStyle;//当前角度值类型private://设置常成员函数的作用:.类成员不会被改变//2.可以被常类变量调用double Deg(double dDms) const;double Dms(double dDeg) const;public://获取指定的类型获取角度值,//由于返回的是dValue的引用,所以该值大小可以改变,即可以进行赋值double& operator() (AngleStyle style);//重载,获取指定的类型获取角度值,该值不可改变,const CAngle类型变量调用double operator() (AngleStyle style) const;//重载运算符+/-friend CAngle operator + (const CAngle& m1,const CAngle& m2);friend CAngle operator - (const CAngle& m1,const CAngle& m2);};Angle.cpp参考老师的角度类运行结果正算反算总结这次试验做了很久,虽然有比较清楚的思路,但是在代码执行过程中出现了很多问题,刚开始的时候,出现了“无法解析的外部函数”,改了很久也没改出来,后来问同学,原来是在构造函数的地方出现了问题,修改后,这个错误没有了。