C++高斯正反算

测绘程序设计基础实验七

实验报告

班 级:测绘0903班

姓 名:

学 号: 指导老师:

实验 7 常用测量程序设计

一、实验目的

1、巩固类的创建与使用 2、掌握数组参数的传递

3、掌握常用测绘程序设计的技巧

二、实验内容

要清楚计算步骤和公式,还有各个参数计算的前后顺序。编写高斯正反算公式。

界面设计

三、实验步骤

1、combox 。

我为了实现椭球参数的选择使用了combox 控件。 添加每行的显示信息

添加combox 函数,定义一个全局变量type 获得选择的参数

2、添加一个C++类,编写关于高斯正反算的各个函数 在头文件中定义

在CPP 中写函数 定义参数

角度转换

改变参数

3、调用函数

四、实验结果 正算:

反算:

#include "stdafx.h" #include "Gauss.h" #include "math.h"

const double PI=3.[***********][1**********]95; double a=6378245;

double b=6356863.0187730473; double e2=sqr(a*a-b*b)/a; double e'2=sqr(a*a-b*b)/b;

double dms2deg(double dms)//度分秒转换度 {

double deg;

int idegree imin; double dsec;

idegree=int(dms);

imin=int((dms-idegree)*100);

dsec=((dms-idegree)*100-imin)*100;

deg=ideree+double(imin/60)+double(dsec/3600); return deg; }

double deg2dms(double deg)//度转换度分秒 {

double dms; int idegree imin; double dsec; double dtmp; idegree=int(dms);

dtmp=(deg=idegree)*60; immin=int(dtmp); dsec=(dtmp-imin)*60; return dms; }

//椭球参数

void ellipd(int type) {

if (type==0) {

a=6378245;

b=6356863.0187730473; e2=0.[***********]; e'2=0.[**************]97; };

if (type==1) {

a=6378140;

b=6356755.2881575287; e2=0.[***********]; e'2=0.[***********]; }; }

//正算

double ComptX(double B) {

double

a0=1+3/4*e2+45/64*pow(e2,2)+350/512*pow(e2,3)+11025/16384*pow(e2,4); double

a2=-1/2*(3/4*e2+60/64*pow(e2,2)+525/512*pow(e2,3)+17640/16384*pow(e2,4)); double a4=1/4*(15/64*pow(e2,2)+210/512*pow(e2,3)+8820/16384*pow(e2,4)); double a6=-1/6*(35/512*pow(e2,3)+2520/16384*pow(e2,4)); double a8=1/8*(315/16384*pow(e2,4));

double X=a*(1-e2)*(a0*B+a2*sin(2*B)+a4*sin(4*B)+a6*sin(6*B)+a8*sin(8*B)); return X; }

double ComptForward(double B,double L,double cmd,int type,double &x,double &y) {

L=dms2deg(L);

cmd=dms2deg(cmd);

double l=(L-cmd)*3600/206265; double b=dms2deg(B)*PI/180; ellipd(type)

double N=a/sqr(1-e2*sin(b)*sin(b)); double t=tan(b);

double n=sqr(e'2)*cos(b); double X=ComptX(b)

x=X+1/2*N*sin(b)*cos(b)*l*l+1/24*N*sin(b)*pow(cos(b),3)*pow(l,4)*(5-t*t+9*n*n+4*pow(n,4))+1/720*pow(l,6)*N*sin(b)*pow(cos(b),5)*(61-58*t*t+pow(t,4))

y=l*N*cos(b)+1/6*pow(l,3)*N*pow(cos(b),3)*(1-t*t+n*n)+1/120*pow(l,5)*N*pow(cos(b),5)*(5-18*t*t+pow(t,4)+14*n*n-58*n*n*t*t) }

//反算

double ComptBf(double x) {

double

a0=1+3/4*e2+45/64*pow(e2,2)+350/512*pow(e2,3)+11025/16384*pow(e2,4); double B0=x/(a*(1-e2)*a0); double

K0=1/2*(3/4*e2+45/64*pow(e2,2)+350/512*pow(e2,3)+11025/16384*pow(e2,4)); double K2=-1/3*(63/64*pow(e2,2)+1108/512*pow(e2,3)+58239/16384*pow(e2,4)); double K4=1/3*(604/512*pow(e2,3)+68484/16384*pow(e2,4));

double K6=-1/3*(26328/16384*pow(e2,4)); double

Bf=B0+sin(2*B0)*(K0+sin(B0)*sin(B0)*(K2+sin(B0)*sin(B0)*(K4+K6*sin(B0)*sin(B0)))); return Bf; }

double ComptInserse(double x,double y,double cmd,int type,double &B,double &L) {

double Bf=ComptBf(Bf); double tf=tan(Bf);

double nf=sqr(e'2)*cos(Bf);

double Nf=a/sqr(1-e2*sin(Bf)*sin(Bf)); double Mf=Nf/(1+e'2*cos(Bf)*cos(Bf)); y=y-500000;

B=Bf-1/(2*Mf*Nf)*tf*y*y+pow(y,4)*tf*(5+3*tf*tf+nf*nf-9*tf*tf*nf*nf)/(24*Mf*pow(Nf,3))-tf*pow(y,6)*(61+90*tf*tf+45*pow(tf,4))/(720*Mf*pow(Nf,5));

l=y/(Nf*cos(Bf))-pow(y,3)*(1+2*tf*tf+nf*nf)+pow(y,5)*(5+28*tf*tf+24*pow(tf,4)+6*nf*nf+8*nf*nf*tf*tf);

L=deg2dms(l/PI*180+dms2deg(cmd)); B=deg2dms(B/PI*180) }

测绘程序设计基础实验七

实验报告

班 级:测绘0903班

姓 名:

学 号: 指导老师:

实验 7 常用测量程序设计

一、实验目的

1、巩固类的创建与使用 2、掌握数组参数的传递

3、掌握常用测绘程序设计的技巧

二、实验内容

要清楚计算步骤和公式,还有各个参数计算的前后顺序。编写高斯正反算公式。

界面设计

三、实验步骤

1、combox 。

我为了实现椭球参数的选择使用了combox 控件。 添加每行的显示信息

添加combox 函数,定义一个全局变量type 获得选择的参数

2、添加一个C++类,编写关于高斯正反算的各个函数 在头文件中定义

在CPP 中写函数 定义参数

角度转换

改变参数

3、调用函数

四、实验结果 正算:

反算:

#include "stdafx.h" #include "Gauss.h" #include "math.h"

const double PI=3.[***********][1**********]95; double a=6378245;

double b=6356863.0187730473; double e2=sqr(a*a-b*b)/a; double e'2=sqr(a*a-b*b)/b;

double dms2deg(double dms)//度分秒转换度 {

double deg;

int idegree imin; double dsec;

idegree=int(dms);

imin=int((dms-idegree)*100);

dsec=((dms-idegree)*100-imin)*100;

deg=ideree+double(imin/60)+double(dsec/3600); return deg; }

double deg2dms(double deg)//度转换度分秒 {

double dms; int idegree imin; double dsec; double dtmp; idegree=int(dms);

dtmp=(deg=idegree)*60; immin=int(dtmp); dsec=(dtmp-imin)*60; return dms; }

//椭球参数

void ellipd(int type) {

if (type==0) {

a=6378245;

b=6356863.0187730473; e2=0.[***********]; e'2=0.[**************]97; };

if (type==1) {

a=6378140;

b=6356755.2881575287; e2=0.[***********]; e'2=0.[***********]; }; }

//正算

double ComptX(double B) {

double

a0=1+3/4*e2+45/64*pow(e2,2)+350/512*pow(e2,3)+11025/16384*pow(e2,4); double

a2=-1/2*(3/4*e2+60/64*pow(e2,2)+525/512*pow(e2,3)+17640/16384*pow(e2,4)); double a4=1/4*(15/64*pow(e2,2)+210/512*pow(e2,3)+8820/16384*pow(e2,4)); double a6=-1/6*(35/512*pow(e2,3)+2520/16384*pow(e2,4)); double a8=1/8*(315/16384*pow(e2,4));

double X=a*(1-e2)*(a0*B+a2*sin(2*B)+a4*sin(4*B)+a6*sin(6*B)+a8*sin(8*B)); return X; }

double ComptForward(double B,double L,double cmd,int type,double &x,double &y) {

L=dms2deg(L);

cmd=dms2deg(cmd);

double l=(L-cmd)*3600/206265; double b=dms2deg(B)*PI/180; ellipd(type)

double N=a/sqr(1-e2*sin(b)*sin(b)); double t=tan(b);

double n=sqr(e'2)*cos(b); double X=ComptX(b)

x=X+1/2*N*sin(b)*cos(b)*l*l+1/24*N*sin(b)*pow(cos(b),3)*pow(l,4)*(5-t*t+9*n*n+4*pow(n,4))+1/720*pow(l,6)*N*sin(b)*pow(cos(b),5)*(61-58*t*t+pow(t,4))

y=l*N*cos(b)+1/6*pow(l,3)*N*pow(cos(b),3)*(1-t*t+n*n)+1/120*pow(l,5)*N*pow(cos(b),5)*(5-18*t*t+pow(t,4)+14*n*n-58*n*n*t*t) }

//反算

double ComptBf(double x) {

double

a0=1+3/4*e2+45/64*pow(e2,2)+350/512*pow(e2,3)+11025/16384*pow(e2,4); double B0=x/(a*(1-e2)*a0); double

K0=1/2*(3/4*e2+45/64*pow(e2,2)+350/512*pow(e2,3)+11025/16384*pow(e2,4)); double K2=-1/3*(63/64*pow(e2,2)+1108/512*pow(e2,3)+58239/16384*pow(e2,4)); double K4=1/3*(604/512*pow(e2,3)+68484/16384*pow(e2,4));

double K6=-1/3*(26328/16384*pow(e2,4)); double

Bf=B0+sin(2*B0)*(K0+sin(B0)*sin(B0)*(K2+sin(B0)*sin(B0)*(K4+K6*sin(B0)*sin(B0)))); return Bf; }

double ComptInserse(double x,double y,double cmd,int type,double &B,double &L) {

double Bf=ComptBf(Bf); double tf=tan(Bf);

double nf=sqr(e'2)*cos(Bf);

double Nf=a/sqr(1-e2*sin(Bf)*sin(Bf)); double Mf=Nf/(1+e'2*cos(Bf)*cos(Bf)); y=y-500000;

B=Bf-1/(2*Mf*Nf)*tf*y*y+pow(y,4)*tf*(5+3*tf*tf+nf*nf-9*tf*tf*nf*nf)/(24*Mf*pow(Nf,3))-tf*pow(y,6)*(61+90*tf*tf+45*pow(tf,4))/(720*Mf*pow(Nf,5));

l=y/(Nf*cos(Bf))-pow(y,3)*(1+2*tf*tf+nf*nf)+pow(y,5)*(5+28*tf*tf+24*pow(tf,4)+6*nf*nf+8*nf*nf*tf*tf);

L=deg2dms(l/PI*180+dms2deg(cmd)); B=deg2dms(B/PI*180) }


相关内容

  • 大地测量实习报告
  • 课程编号:1300158 课程性质:必修 大地测量计算与实习 实 习 报 告 学 院: 测绘学院 专业方向: 测绘工程A方向 实习地点: 武汉大学 班级组号: 学生姓名: 学号: 指导教师: 刘宗泉 苏新洲 丁士俊 向 东 黄海兰 2012年 6月18日 至 2012年 7月4 日 目录 目 录.. ...

  • 大地测量计算与实习报告
  • 课程编号: [1**********] 课程编号: 课程性质: 必修 课程性质: 大地测量计算与实习 实 习 报 告 学院: 学院: 专业: 专业: 地点: 地点: 班级: 班级: 组号: 组号: 姓名: 姓名: 学号: 学号: 教师: 教师: 测 绘 学 院 测 绘 工 程 校 20xxxx 第1 ...

  • 人脸识别方法的研究与实现
  • 人脸识别方法的研究与实现 目 录 第一章 绪论 第一节 课题背景 一 课题的来源------------------------------------------------------------------------------1 二 人脸识别技术的研究意义----------------- ...

  • 大地测量学实习报告书
  • 大地测量学实习报告书 组长: 张体强 组员: 张翔,张凯琪,吴佳,郭晓雷,周玮晨 班级: 海测一 所在学校: 上海海洋大学 任课老师: 朱卫东 上海海洋大学-海洋科学学院 二零一三 年 三 月 声明:本次实习报告书属于本小组独立完成,不存在盗窃别组的报告书情况,若有类同,该版为先. 目录 一.实习目 ...

  • 单细胞拉曼光谱系统控制软件
  • 单细胞拉曼光谱系统控制软件 单细胞拉曼光谱系统控制软件是针对拉曼光谱系统的具体功能要求并结合硬件系统来进行设计和实现.根据硬件系统待实现的功能来对相应器件进行二次开发,以达到系统原位.实时.连续.自动获取单细胞拉曼光谱的目的. §1 单细胞拉曼光谱系统控制软件总体设计 §1.1 开发环境 本套系统软 ...

  • 坐标正反算
  • 一.坐标正算与坐标反算 1.坐标正算 已知点的坐标.边的方位角.两点间的水平距离,计算待定点的坐标,称为坐标正算. 如图6-6 所示,点的坐标可由下式计算: 式中. 为两导线点坐标之差,称为坐标增量,即: =1000.=1000.方位角 [例题6-1]已知点A坐标,=35°17'36.5" ...

  • 放射性气体扩散浓度预估模型
  • 基于高斯修正模型的放射性气体扩散浓度预测 摘 要 本文是以日本福岛核电站遭遇自然灾害发生核泄漏的背景而提出的. 对于问题一,考虑到放射性物质的泄漏是连续不断的.本文根据"泄漏放射性物质质量守恒定律"和"气体泄漏连续性原理"建立了微积分方程,应用了高等数学中散度 ...

  • 计算方法实验报告_列主元高斯消去法
  • 计 算 方 法 实 验 报 告 动力与机械学院 08级自动化3班 唐禹 [1**********]78 2010.11.08 实验一 :使用列主元消去法求解线性方程组 列主元消去法是在Gauss消去法的基础上改进而得的一种比较快速和合理的求解线性方程组的方法.它的主要思路是通过对每次消元过程中主元的 ...

  • ICM颁发的数学奖项
  • 徐传胜已有 937 次阅读 2014-6-6 11:17 |系统分类:人物纪事   2014年8月13-21日,第27届ICM(International Congress of Mathematicians)将在韩国首尔举行.此次大会将有来自全球100个国家和地区的约5000名数学家参加,是历史上 ...