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