📄 hardy_changedlg.cpp
字号:
// Hardy_ChangeDlg.cpp : implementation file
//
#include "stdafx.h"
#include "GeoinModel.h"
#include "Hardy_ChangeDlg.h"
#include "matrix.h"
extern double CenterL(double dl);
extern double CenterB(double db);
extern double ReturnCenterL(double dl);
extern double ReturnCenterB(double db);
extern double Arc2DMS(double dd);
extern double int_radian(double intdeg);
extern double deg_int(double gms);
extern double myu(double a, double b);
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CHardy_ChangeDlg dialog
CHardy_ChangeDlg::CHardy_ChangeDlg(CWnd* pParent /*=NULL*/)
: CDialog(CHardy_ChangeDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CHardy_ChangeDlg)
m_dInputB = 25.191264147;
m_dInputH = 72.3032;
m_dInputL = 118.574388797;
m_dOutputh = 0.0;
m_strOutputFilePath = _T("");
m_strParamFilePath = _T("");
m_strInputFilePath = _T("");
//}}AFX_DATA_INIT
}
void CHardy_ChangeDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CHardy_ChangeDlg)
DDX_Text(pDX, IDC_EDTB, m_dInputB);
DDV_MinMaxDouble(pDX, m_dInputB, 24.5, 26.);
DDX_Text(pDX, IDC_EDTH, m_dInputH);
DDV_MinMaxDouble(pDX, m_dInputH, 0., 1500.);
DDX_Text(pDX, IDC_EDTL, m_dInputL);
DDV_MinMaxDouble(pDX, m_dInputL, 118.2, 119.5);
DDX_Text(pDX, IDC_EDTOuth, m_dOutputh);
DDX_Text(pDX, IDC_EDTOutBLHFilePath, m_strOutputFilePath);
DDX_Text(pDX, IDC_EDTParamFilePath, m_strParamFilePath);
DDX_Text(pDX, IDC_EDTInBLHFilePath, m_strInputFilePath);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CHardy_ChangeDlg, CDialog)
//{{AFX_MSG_MAP(CHardy_ChangeDlg)
ON_BN_CLICKED(IDC_BTNFileChange, OnBTNFileChange)
ON_BN_CLICKED(IDC_BTNKeyBoardChange, OnBTNKeyBoardChange)
ON_BN_CLICKED(IDC_BTNOpenParamFilePath, OnBTNOpenParamFilePath)
ON_BN_CLICKED(IDC_BTNOpenInBLHFile, OnBTNOpenInBLHFile)
ON_BN_CLICKED(IDC_BTNOpenOutBLHFile, OnBTNOpenOutBLHFile)
ON_EN_CHANGE(IDC_EDTB, OnChangeEdtb)
ON_EN_CHANGE(IDC_EDTL, OnChangeEdtl)
ON_EN_CHANGE(IDC_EDTH, OnChangeEdth)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
void CHardy_ChangeDlg::OnCancel()
{
CDialog::OnCancel();
}
//转换--键盘输入
void CHardy_ChangeDlg::OnBTNFileChange()
{
//////////////////////////////////////////////////////////
int i,j;
CString strCoreFunction,strP; //核函数类型,权函数类型
CString stra,strq,strb,strB,strL,strH,strE;
double dCodea[200],dCodeq[200],dCodeb[200],dCodeB[200],dCodeL[200],dCodeE[200];
//dCodeH[200],
int iCodeNum; //节点个数
//◎读取参数文件,注意参数文件中可能有多组参数,默认读取第一组参数
if(m_strParamFilePath=="")
{
MessageBox("请先打开参数文件,再进行转换。CHardy_ChangeDlg::OnBTNFileChange()");
return;
}
strCoreFunction="不顾及高程项";
//转换参数a,平滑参数q,曲面参数b(0.5/-0.5),大地经度,大地纬度,高程异常
char buffer[256];
FILE *File =fopen(m_strParamFilePath,"r");
if(fgets(buffer,256,File)!=NULL)
{ //首行,起始标志-9999.9999,节点个数
stra=strtok(buffer,",, ");
strb=strtok('\0',",, ");
iCodeNum=atoi(strb);
}
else
{
MessageBox("参数文件为空,无法进行转换。CHardy_ChangeDlg::OnBTNFileChange()");
return;
}
if( iCodeNum<=0)
{
MessageBox("参数数据文件有误,请查看。");
return;
}
for(i=1;i<=iCodeNum;i++)
{
if(fgets(buffer,256,File)!=NULL)
{
stra=strtok(buffer,",, ");
strq=strtok('\0',",, ");
strb=strtok('\0',",, ");
strB=strtok('\0',",, ");
strL=strtok( '\0',",, ");
strE=strtok('\0',",, ");
dCodea[i]=atof(stra); //转换参数a
dCodeq[i]=atof(strq); //平滑系数q
dCodeb[i]=atof(strb); //曲面参数b(0.5/-0.5)
dCodeB[i]=atof(strB);
dCodeL[i]=atof(strL);
dCodeE[i]=atof(strE); //高程异常
}
}
fclose(File);
//////////////////////////////////////////////////////////
//◎将输入的经纬度化弧度,并中心化
double dl,db,dH84,de,dCore;
db=int_radian(deg_int(m_dInputB));
db=CenterB(db); //中心化
dl=int_radian(deg_int(m_dInputL));
dl=CenterL(dl); //中心化
dH84=m_dInputH;
//◎进行转换
de=0;
for(j=1;j<=iCodeNum;j++)
{
//1、根据核函数的形式
if(strCoreFunction=="不顾及高程项") //核函数:不顾及高程项
{
dCore=sqrt(pow(dl-dCodeL[j],2)+pow(db-dCodeB[j],2)+dCodeq[j]);
}
/* else if(strCoreFunction=="顾及高程项") //核函数:顾及高程项
{
dCore=sqrt(pow(dl-dCodeL[j],2)+pow(db-dCodeB[j],2)+pow(dH84-dCodeH[j],2)+dCodeq[j]);
}*/
//2、根据b(1/2;-1/2)
if(dCodeb[j]==-0.5) dCodeb[j]=0.6;
if(dCodeb[j]>0.5 && dCore!=0)
{
dCore=1.0/dCore;
}
//3、计算
de=de+dCodea[j]*dCore;
}
m_dOutputh=dH84-de;
UpdateData(false);
}
//转换--文件输入
void CHardy_ChangeDlg::OnBTNKeyBoardChange()
{
//////////////////////////////////////////////////////////
int i,j;
CString strCoreFunction,strP; //核函数类型,权函数类型
CString stra,strq,strb,strB,strL,strH,strE;
double dCodea[200],dCodeq[200],dCodeb[200],dCodeB[200],dCodeL[200],dCodeE[200];
//dCodeH[200]
int iCodeNum; //节点个数
//◎读取参数文件
if(m_strParamFilePath=="")
{
MessageBox("请先打开参数文件,再进行转换。CHardy_ChangeDlg::OnBTNFileChange()");
return;
}
//转换参数a,平滑参数q,曲面参数b(0.5/-0.5),大地经度,大地纬度,高程异常
char buffer[256];
FILE *File =fopen(m_strParamFilePath,"r");
strCoreFunction="不顾及高程项";
if(fgets(buffer,256,File)!=NULL)
{
//-9999.9999,节点数
stra=strtok(buffer,",, ");
strq=strtok('\0',",, ");
iCodeNum=atoi(strq);
}
else
{
MessageBox("参数文件为空,无法进行转换。CHardy_ChangeDlg::OnBTNFileChange()");
return;
}
if( iCodeNum<=0)
{
MessageBox("参数数据文件有误,请查看。");
return;
}
for(i=1;i<=iCodeNum;i++)
{
if(fgets(buffer,256,File)!=NULL)
{
stra=strtok(buffer,",, ");
strq=strtok('\0',",, ");
strb=strtok('\0',",, ");
strB=strtok('\0',",, ");
strL=strtok( '\0',",, ");
strE=strtok('\0',",, ");
dCodea[i]=atof(stra); //转换参数a
dCodeq[i]=atof(strq); //平滑系数q
dCodeb[i]=atof(strb); //曲面参数b(0.5/-0.5)
dCodeB[i]=atof(strB);
dCodeL[i]=atof(strL);
//经纬度是中心化过的
dCodeE[i]=atof(strE); //高程异常
}
}
fclose(File);
//////////////////////////////////////////////////////////
//◎读待转换文件
CString strPtName[300];
double dB[300],dL[300],dH[300],dE[300];
int iChangeNum;
CString strPtname;
File=fopen(m_strInputFilePath,"r");
iChangeNum=0;
while(fgets(buffer,256,File)!=NULL)
{
strPtname=strtok(buffer,",, ");
strB=strtok('\0',",, ");
strL=strtok( '\0',",, ");
strH=strtok('\0',",, ");
iChangeNum++;
strPtName[iChangeNum]=strPtname;
dB[iChangeNum]=int_radian(deg_int(atof(strB)));
dB[iChangeNum]=CenterB(dB[iChangeNum]); //中心化
dL[iChangeNum]=int_radian(deg_int(atof(strL)));
dL[iChangeNum]=CenterL(dL[iChangeNum]); //中心化
dH[iChangeNum]=atof(strH);
}
fclose(File);
if( iChangeNum<=0)
{
MessageBox("待转换数据文件有误,请查看。");
return;
}
//////////////////////////////////////////////////////////
double dCore;
//◎进行转换
for(i=1;i<=iChangeNum;i++)
{
dE[i]=0;
for(j=1;j<=iCodeNum;j++)
{
//1、根据核函数的形式
if(strCoreFunction=="不顾及高程项") //核函数:不顾及高程项
{
dCore=sqrt(pow(dL[i]-dCodeL[j],2)+pow(dB[i]-dCodeB[j],2)+dCodeq[j]);
}
/* else if(strCoreFunction=="顾及高程项") //核函数:顾及高程项
{
dCore=sqrt(pow(dL[i]-dCodeL[j],2)+pow(dB[i]-dCodeB[j],2)+pow(dH[i]-dCodeH[j],2)+dCodeq[j]);
}*/
//2、根据b(1/2;-1/2)
if(dCodeb[j]==-0.5) dCodeb[j]=0.6;
if(dCodeb[j]>0.5 && dCore!=0)
{
dCore=1.0/dCore;
}
//3、计算
dE[i]=dE[i]+dCodea[j]*dCore;
}
}
//还原经度,纬度,并转换成dd.mmsss格式
for(i=1;i<=iChangeNum;i++)
{
dB[i]=Arc2DMS(ReturnCenterB(dB[i])); //中心化,并弧度——dd.mmsss
dL[i]=Arc2DMS(ReturnCenterL(dL[i]));
}
////////////////////////////////////////////////////////
//◎写入文件,点名,纬度,经度,大地高,正常高,高程异常
if(m_strOutputFilePath!="")
{
if((File=fopen(m_strOutputFilePath ,"wt"))!=NULL)
{
for(j=1;j<=iChangeNum;j++) fprintf(File,"%s,%.9f,%.9f,%.4f,%.4f,%.4f\n",
strPtName[j],dB[j],dL[j],dH[j],dH[j]-dE[j],dE[j]);
fprintf(File,"\n");
MessageBox("计算完成,请查看计算结果CHardy_ChangeDlg::OnBTNKeyBoardChange()");
fclose(File);
}
else
{
MessageBox("写入结果文件出错,请检查。。。");
}
//打开文本文件
CString Command;
Command = "notepad ";
Command += m_strOutputFilePath;
WinExec(Command,SW_SHOWMAXIMIZED);
}
}
//打开参数文件
void CHardy_ChangeDlg::OnBTNOpenParamFilePath()
{
CString FileName;
CFileDialog file(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
TEXT("Chart Files (*.txt)|*.txt"),NULL);
if(file.DoModal()==IDOK)
{
m_strParamFilePath=file.m_ofn.lpstrFile;
UpdateData(false);
}
}
//打开输入文件
void CHardy_ChangeDlg::OnBTNOpenInBLHFile()
{
CString FileName;
CFileDialog file(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
TEXT("Chart Files (*.txt)|*.txt"),NULL);
if(file.DoModal()==IDOK)
{
m_strInputFilePath=file.m_ofn.lpstrFile;
UpdateData(false);
}
}
//打开输出文件
void CHardy_ChangeDlg::OnBTNOpenOutBLHFile()
{
CString FileName;
CFileDialog file(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
TEXT("Chart Files (*.txt)|*.txt"),NULL);
if(file.DoModal()==IDOK)
{
m_strOutputFilePath=file.m_ofn.lpstrFile;
UpdateData(false);
}
}
void CHardy_ChangeDlg::OnChangeEdtb()
{
UpdateData(true);
}
void CHardy_ChangeDlg::OnChangeEdtl()
{
UpdateData(true);
}
void CHardy_ChangeDlg::OnChangeEdth()
{
UpdateData(true);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -