常用测量程序设计

《测绘程序设计(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 控件,改了很多次,最后没法用了感觉。于是我又重做了一次,这次只定义了一个类,经过一些修改,终于可以运行了。不过在运行之后出现了

不知怎么解决,第一次遇到这种情况。


相关内容

  • 建筑施工手册_第五版_共5册(完整打包)
  • 内容推荐 建筑施工手册 _ 第五版 _ 共 5 册(完整打包) 下载网址 http://pan.baidu.com/s/1qW5a0Le 国内最好用还免费的CAD画图程序 国内最优秀的钣金展开软件 下载网址: http://www.duote.com/soft/12427.html <建筑施工 ...

  • 现代铁路工程师手册
  • 现代铁路工程师手册 四册998元 第一章计量单位换算常用数据 第二章 铁路工程材料规格性能常用数据 第三章 铁路基础工程施工常用数据 第四章 路基施工常用数据 第五章 钢木结构工程施工常用数据 第六章 安全技术常用数据 第二篇 铁路工程师常用地质勘探技术 第一章 矿物与岩石 第二章 地质构造 第三章 ...

  • 三坐标测量机坐标系的常用建立方法
  • Equipment Manufacturing Technology No.1,2015 三坐标测量机坐标系的常用建立方法 李 庆 芜湖 241000) 安徽合肥230009:2.安徽机电职业技术学院,安徽(1.合肥工业大学, 摘 要:三坐标测量机随着我国制造业的发展而迅速普及.本文以PC-DM I ...

  • 电子测量实训报告
  • 一. 实训目的(1) 熟悉常用电子仪器的功能及使用方法。(2) 掌握常用电子仪器的工作原理。(3) 掌握常用电子仪器附加功能的使用。(4) 熟练使用常用电子仪器进行数据测量。(5) 掌握常用电子元器件的测量方法,掌握电子元器件的焊接技巧和装配工艺;学会 使用万用表、示波器、毫伏表、频率计、 信号发生 ...

  • 实验室简介
  • 机械系统设计实验室 1.实验室简介 机械系统设计实验室主要承担机械原理.机械设计.机械设计基础等相关技术基础课程的实验教学,主要开设的实验项目有10个.通过实验培养学生绘制机构运动简图和进行简单机械运动参数测定等方面的实际能力,增强学生对机械零件和装置进行力.力矩.转速及效率等测试的动手能力,能够进 ...

  • 油品计量工高级
  • 2009年职业技能鉴定操作技能考核项目 油品计量工 高 级 中国石油大庆职业技能鉴定中心 油品计量工高级试题目录 试题一.取界面样(取样检尺操作40%) 试题二.用量油尺进行空尺的测量(取样检尺操作40%) 试题三.用杯盒温度计进行油温的测量(取样检尺操作40%) 试题四.某温度下的密度测量(测温测 ...

  • 几种常用光学方法测量薄膜厚度设计_苏宝玺
  • 第33卷第4期 长春师范大学学报(自然科学版) Journal of Changchun Normal University(NaturalScience) 2014年8月 Aug.2014 Vol.33No.4 几种常用光学方法测量薄膜厚度设计 苏宝玺,杨文琴,吴荣琴 (福建师范大学闽南科技学院, ...

  • 量检具设计-副本
  • 资料来源于好域安机械技术论坛 http://www.haoyuansz.com/bbs/dispbbs.asp?boardID=29&ID=3163&page=1 注意:只须注册成为会员即可下载本论坛所有技术资料. 量具类 1.量具量仪卷http://www.haoyuansz.co ...

  • 机械工程师考试科目及内容
  • 机械工程师考试科目及内容 一.工程制图与公差配合 1.工程制图的一般规定 (1)图框 (2)图线 (3)比例 (4)标题栏 (5)视图表示方法 (6)图面的布置 (7)剖面符号与画法 2.零.部件(系统)图样的规定画法 (1)机械系统零.部件图样的规定画法(螺纹及螺纹紧固件的画法 齿轮.齿条.蜗杆. ...

  • 施工手册第五版目录
  • <建筑施工手册1> 目录 1施工项目管理 1.1施工项目管理概述 1.1.1基本概念 1.1.1.1项目.建设项目 1.1.1.2施工项目 1.1.1.3项目管理.建设项目管理 1.1.1.4施工项目管理 1.1.1.5施工项目管理与建设项目管理的区别 1.1.2施工项目管理程序及内容 ...