测绘程序设计基础 实验1 CSU

实验1 控制结构程序设计

(方位角计算、三维地心座标至大地座标转换)

(工具:VS2010)

一、 实验目的

• 掌握VC++.net语言的基本语法;
• 理解顺序结构、选择结构和循环结构程序设计的特点及应用;
• 掌握对基于对话框的MFC应用程序设计方法;
• 掌握方位角计算算法、座标转换算法设计与实现。

二、实验内容与要求

1.编写一个方位角计算程序。要求:方位角输出为度分秒形式。
2.编写三维地心座标至大地座标转换互相转换程序。

三、设计与实现:

3.1 设计思路:(主要以方位角为例写出)

1 在【文件】菜单执行【新建】,选择【项目】
2 在【项目类型】窗格中,选择【Visual C++】下的“MFC”项。在【模板】窗格中,选择“MFC 应用程序”模板,输入应用名称“YG1701_10_ZRX_方位角2.0”。按向导创建“YG1701_10_ZRX_方位角2.0”的MFC应用程序,应用程序类型为基于对话框。
3 在窗体上放置6个静态文本框、5个编辑框、3个命令按钮。
4 设置控件属性:
4.1 将5个编辑框依次右击执行【添加变量】,在弹出的【添加成员变量向导】对话框中,【类别】属性更改为“Value”型,【变量类型】属性更改为“double”型,将【变量名】依次命名为:X1、Y1、X2、Y2、fwj;
4.2 点击其中一命令按钮,将其【Caption】属性更改为“计算”。双击命令按钮,进入“void CYG1701_10_ZRX_方位20Dlg::OnBnClickedButton1()”中,添加代码,在该.cpp文件中依次添加以上三个函数并辅以说明;另一完成归零功能的命令按钮操作与上类似。
5 运行和调试程序;
6 保存应用程序。

3.2 界面设计:

3.2.1方位角计算

在这里插入图片描述
主要控件属性:
在这里插入图片描述

3.2.2三维地心座标与大地座标转换相互转换

在这里插入图片描述
主要控件属性:
在这里插入图片描述

3.3主要代码:

//3.3.1YG1701_10_ZRX_方位角2.0Dlg
/***************************************************************************
*  文件名:<YG1701_10_ZRX_方位角2.0>                                        *
*                                                                          *
*  描述:方位角计算,调用三个函数Process_Rad Process_D Process_Degree       *
*                                                                          *
*  历史:**日期**         **理由**            **签名**                     *
*      2019年3月8日       代码格式修改        张一青                       *
*                                                                          *
*  外部过程:                                                              *
*                                                                          *
/**************************************************************************

/***************************************************************************
*  名字:double Process_Rad(double dx1,double dy1,double dx2,double dy2)   *
*                                                                          *
*  描述:4个座标值--》弧度式方位角                                         *
*                                                                          *
*  历史:**日期**         **理由**            **签名**                     *
*      2019年3月8日       创建该函数          张一青                       *
*                                                                          *
*  参数: 1.double dx1                                                     *
*         2.double dy1                                                     *
*		 3.double dx2                                                      * 
*		 4.double dy2                                                      * 
*                                                                          *
*  返回值:double类型数据   转换后的rad型方位角                            *
*                                                                          *
*  注:该函数在输入两座标值相同时,会有一对话框弹出,且此时返回值为0       *
/**************************************************************************/
double Process_Rad(double dx1,double dy1,double dx2,double dy2)
{
	double dx=dx2-dx1;
	double dy=dy2-dy1;
	double dRad;
	if(dy>0){
		if(dx<0){
			dRad=atan(dy/dx)+PI;//第二象限
		}
		else if(dx>0){
			dRad=atan(dy/dx);//第一象限
		}
		else{
			dRad=PI/2;//位于Y轴正方向
		}
	}
	else if(dy<0){
		if(dx<0){
			dRad=atan(dy/dx)+PI;//第三象限
		}
		else if(dx>0){
			dRad=atan(dy/dx)+2*PI;//第四象限
		}
		else{
			dRad=PI*3/2;//位于Y轴负方向
		}
	}
	else{
		if(dx>0){
			dRad=0;//位于X正半轴
		}
		else if(dx<0){
			dRad=PI;//位于X负半轴
		}
		else{
			AfxMessageBox(_T("您不能输入相同的座标。"));//(x1,y1)==(x2,y2)的情况  
			return 0;
		}
	}
	return dRad;
}
/***************************************************************************
*  名字:double Process_D(double dRad1)                                    *
*                                                                          *
*  描述:弧度式方位角--》十进制的角度值                                    *
*                                                                          *
*  历史:**日期**         **理由**            **签名**                     *
*      2019年3月8日       创建该函数          张一青                       *
*                                                                          *
*  参数: 1.double dRad1                                                   *
*                                                                          *
*                                                                          *
*  返回值:double类型数据 dt 返回十进制的角度值                            *
*                                                                          *
*  注:                                                                    *
/**************************************************************************/
double Process_D(double dRad1)
{
	double dt;
	dt=dRad1*180/PI;
	return dt;
}

/***************************************************************************
*  名字:double Process_Degree(double dD)                                  *
*                                                                          *
*  描述:十进制的角度值--》度分秒形式                                      *
*                                                                          *
*  历史:**日期**         **理由**            **签名**                     *
*      2019年3月8日       创建该函数          张一青                       *
*                                                                          *
*  参数: 1.double dD                                                      *
*                                                                          *
*                                                                          *
*  返回值:double类型数据 dDegree 返回度分秒形式                           *
*                                                                          *
*  注:                                                                    *
/**************************************************************************/
double Process_Degree(double dD)
{
	double dDegree;
	int iDegree;
	int iMin;
	double dSec;
	double dTmp;
	iDegree=int(dD);
	dTmp=(dD-iDegree)*60;
	iMin=int(dTmp);
	dSec=(dTmp-iMin)*60;
	dDegree=iDegree+double(iMin)/100+dSec/10000;
	return dDegree;
}

//按钮
void CYG1701_10_ZRX_方位角20Dlg::OnBnClickedButton1()
{
	UpdateData(TRUE);
	fwj=Process_Degree(Process_D(Process_Rad(X1,Y1,X2,Y2)));// 调用了三次函数  座标值--》弧度式方位角--》十进制的角度值--》度分秒形式
    UpdateData(FALSE);
}



3.3.2YG1701_10_ZRX_座标转换2.0Dlg
/***************************************************************************
*  文件名:<YG1701_10_ZRX_座标转换2.0>                                      *
*                                                                          *
*  描述:座标转换,调用六个函数                                             *
*                                                                          *
*  历史:**日期**         **理由**            **签名**                     *
*      2019年3月8日       代码格式修改        张一青                       *
*                                                                          *
*  外部过程:                                                              *
*                                                                          *
/**************************************************************************/

/***************************************************************************
*  名字:double Process_Degree(double dD)                                  *
*                                                                          *
*  描述:十进制的角度值--》度分秒形式                                      *
*                                                                          *
*  历史:**日期**         **理由**            **签名**                     *
*      2019年3月8日       创建该函数          张一青                       *
*                                                                          *
*  参数: 1.double dD                                                      *
*                                                                          *
*                                                                          *
*  返回值:double类型数据 dDegree 返回度分秒形式                           *
*                                                                          *
*  注:                                                                    *
/**************************************************************************/
double Process_Degree(double dD)
{
	double dDegree;
	int iDegree;
	int iMin;
	double dSec;
	double dTmp;
	iDegree=int(dD);
	dTmp=(dD-iDegree)*60;
	iMin=int(dTmp);
	dSec=(dTmp-iMin)*60;
	dDegree=iDegree+double(iMin)/100+dSec/10000;
	return dDegree;
}

/***************************************************************************
*  名字:double Process_D(double dRad1)                                    *
*                                                                          *
*  描述:弧度式方位角--》十进制的角度值                                    *
*                                                                          *
*  历史:**日期**         **理由**            **签名**                     *
*      2019年3月8日       创建该函数          张一青                       *
*                                                                          *
*  参数: 1.double dRad1                                                   *
*                                                                          *
*                                                                          *
*  返回值:double类型数据 dt 返回十进制的角度值                            *
*                                                                          *
*  注:                                                                    *
/**************************************************************************/
double Process_D(double dRad1)
{
	double dt;
	dt=dRad1*180/PI;
	return dt;
}

/*************************************************************************** 
*  名字:Process_3DtoGS84()                                                *
*                                                                          *
*  描述:3维座标向大地座标GS84转换     以B=0为始进行迭代                   *
*                                                                          *
*  历史:**日期**         **理由**            **签名**                     *
*      2019年3月8日       创建该函数          张一青                       *
*                                                                          *
*  参数: 1.double dX                                                      *
*         2.double dY                                                      *
*         3.double dX                                                      *
*         4.double &dLL                                                    *
*         5.double &dBB                                                    *
*         6.double &dHH                                                    *
*                                                                          *
*                                                                          *
*  返回值:无                                                              *
*                                                                          *
*  注:需要调用两个函数 Process_Degree Process_Degree                      *
/**************************************************************************/
void Process_3DtoGS84(double dX,double dY,double dZ,double &dLL,double &dBB,double &dHH)
{
	const double dS=sqrt(dX*dX+dY*dY);
	const double der=2*Alfa-Alfa*Alfa;
	double dB;
	double dB0=0;
	double dH;
	double dH0=dS-a;
	double db;
	double dN=a;
	double dW;
	//迭代过程
	do
	{
		dB=atan(dZ/(dS*(1-der*dN/(dN+dH0))));
		dW=sqrt(1-der*sin(dB)*sin(dB));
		dN=a/dW;
		dH=dS/cos(dB)-dN;
		db=dB-dB0;
		dB0=dB;
		dH0=dH;
	}while(fabs(db)>=0.0001);
	//求B
	dBB=Process_Degree(Process_D(dB0));
	//求H 
	dHH=dH0;
    //进行L的转换
	double L1=atan2(dY,dX)*180/Pi;
	L1=Process_Degree(L1);
	dLL=L1;
	}

/***************************************************************************
*  名字:Process_oppDegree(double dDms)                                    *
*                                                                          *
*  描述:度分秒形式--》十进制的角度值                                      *
*                                                                          *
*  历史:**日期**         **理由**            **签名**                     *
*      2019年3月8日       创建该函数          张一青                       *
*                                                                          *
*  参数: 1.double dDms                                                    *
*                                                                          *
*                                                                          *
*  返回值:double类型数据 dDeg 返回十进制的角度值                          *
*                                                                          *
*  注:                                                                    *
/**************************************************************************/
double Process_oppDegree(double dDms)
{
	int iDegree,iMin;
	double dSec;
	double dDeg;
	iDegree=int(dDms);
	iMin=int((dDms-iDegree)*100);
	dSec=((dDms-iDegree)*100-iMin)*100;
	dDeg=iDegree+double(iMin)/60+dSec/3600;
	return dDeg;
}

/***************************************************************************
*  名字:double Process_oppD(double dDeg)                                  *
*                                                                          *
*  描述:十进制的角度值--》弧度式方位角                                    *
*                                                                          *
*  历史:**日期**         **理由**            **签名**                     *
*      2019年3月8日       创建该函数          张一青                       *
*                                                                          *
*  参数: 1.double dDeg*PI/180                                             *
*                                                                          *
*                                                                          *
*  返回值:double类型数据 返回弧度值                                       *
*                                                                          *
*  注:                                                                    *
/**************************************************************************/
double Process_oppD(double dDeg)
{
	return dDeg*PI/180;
}

/***************************************************************************
*  名字:Process_GS84to3D()                                                *
*                                                                          *
*  描述:大地座标GS84转换向3维座标                                         *
*                                                                          *
*  历史:**日期**         **理由**            **签名**                     *
*      2019年3月8日       创建该函数          张一青                       *
*                                                                          *
*  参数: 1.double &dX                                                     *
*         2.double &dY                                                     *
*         3.double &dX                                                     *
*         4.double dLL                                                     *
*         5.double dBB                                                     *
*         6.double dHH                                                     *
*                                                                          *
*                                                                          *
*  返回值:无                                                              *
*                                                                          *
*  注:需要调用两个函数 Process_Degree Process_Degree                      *
/**************************************************************************/
void Process_GS84to3D(double &dX,double &dY,double &dZ,double dLL,double dBB,double dHH)
{
	double dNN;
	dLL=Process_oppD(Process_oppDegree(dLL));
	dBB=Process_oppD(Process_oppDegree(dBB));
	dHH=dHH;
	double der=2*Alfa-Alfa*Alfa;
	dNN=a/sqrt(1-der*sin(dBB)*sin(dBB));

	dX=(dNN+dHH)*cos(dBB)*cos(dLL);
	dY=(dNN+dHH)*cos(dBB)*sin(dLL);
	dZ=(dNN*(1-der)+dHH)*sin(dBB);
}

void CYG1701_10_ZRX_座标转换20Dlg::OnBnClickedButton2()
{
	// TODO: 在此添加控件通知处理程序代码
	UpdateData(TRUE);
	Process_GS84to3D(X,Y,Z,L,B,H);
	UpdateData(FALSE);
}

3.4运行结果

在这里插入图片描述在这里插入图片描述在这里插入图片描述

3.5设计技巧:

一共设计了6个函数,进行了多次调用。程序便于修改。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章