(工具:VS2010)
• 掌握VC++.net语言的基本语法;
• 理解顺序结构、选择结构和循环结构程序设计的特点及应用;
• 掌握对基于对话框的MFC应用程序设计方法;
• 掌握方位角计算算法、坐标转换算法设计与实现。
1.编写一个方位角计算程序。要求:方位角输出为度分秒形式。
2.编写三维地心坐标至大地坐标转换互相转换程序。
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.3.1YG1701_10_ZRX_方位角2.0Dlg
/***************************************************************************
* 文件名: *
* *
* 描述:方位角计算,调用三个函数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
/***************************************************************************
* 文件名: *
* *
* 描述:坐标转换,调用六个函数 *
* *
* 历史:**日期** **理由** **签名** *
* 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);
}
一共设计了6个函数,进行了多次调用。程序便于修改。