📄 diedai.cpp
字号:
// DIEDAI.cpp : implementation file
//
#include "stdafx.h"
#include "qianfangjiaohui.h"
#include "DIEDAI.h"
#include "math.h"
#include "Matrix.h"
#include <fstream.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDIEDAI dialog
CDIEDAI::CDIEDAI(CWnd* pParent /*=NULL*/)
: CDialog(CDIEDAI::IDD, pParent)
{
//{{AFX_DATA_INIT(CDIEDAI)
m_F_L = 0.0;
m_F_R = 0.0;
m_X = 0.0;
m_x_L = 0.0;
m_x_R = 0.0;
m_X0_L =0.0 ;
m_X0_R = 0.0;
m_Xs_L = 0.0;
m_Xs_R = 0.0;
m_Y = 0.0;
m_y_L = 0.0;
m_y_R = 0.0;
m_Y0_L = 0.0;
m_Y0_R = 0.0 ;
m_Ys_L = 0.0;
m_Ys_R = 0.0;
m_Z = 0.0;
m_Zs_L = 0.0;
m_Zs_R = 0.0;
m_Kappa_L = "";
m_Kappa_R = "";
m_Omega_L ="" ;
m_Omega_R ="" ;
m_Phi_L = "";
m_Phi_R = "";
m_QX = 0.0;
m_QY = 0.0;
m_QZ = 0.0;
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
void CDIEDAI::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDIEDAI)
DDX_Text(pDX, IDC_F_L, m_F_L);
DDX_Text(pDX, IDC_F_R, m_F_R);
DDX_Text(pDX, IDC_X, m_X);
DDX_Text(pDX, IDC_x_L, m_x_L);
DDX_Text(pDX, IDC_x_R, m_x_R);
DDX_Text(pDX, IDC_X0_L, m_X0_L);
DDX_Text(pDX, IDC_X0_R, m_X0_R);
DDX_Text(pDX, IDC_Xs_L, m_Xs_L);
DDX_Text(pDX, IDC_Xs_R, m_Xs_R);
DDX_Text(pDX, IDC_Y, m_Y);
DDX_Text(pDX, IDC_y_L, m_y_L);
DDX_Text(pDX, IDC_y_R, m_y_R);
DDX_Text(pDX, IDC_Y0_L, m_Y0_L);
DDX_Text(pDX, IDC_Y0_R, m_Y0_R);
DDX_Text(pDX, IDC_Ys_L, m_Ys_L);
DDX_Text(pDX, IDC_Ys_R, m_Ys_R);
DDX_Text(pDX, IDC_Z, m_Z);
DDX_Text(pDX, IDC_Zs_L, m_Zs_L);
DDX_Text(pDX, IDC_Zs_R, m_Zs_R);
DDX_Text(pDX, IDC_Kappa_L, m_Kappa_L);
DDX_Text(pDX, IDC_Kappa_R, m_Kappa_R);
DDX_Text(pDX, IDC_Omega_L, m_Omega_L);
DDX_Text(pDX, IDC_Omega_R, m_Omega_R);
DDX_Text(pDX, IDC_Phi_L, m_Phi_L);
DDX_Text(pDX, IDC_Phi_R, m_Phi_R);
DDX_Text(pDX, IDC_QX, m_QX);
DDX_Text(pDX, IDC_QY, m_QY);
DDX_Text(pDX, IDC_QZ, m_QZ);
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDIEDAI, CDialog)
//{{AFX_MSG_MAP(CDIEDAI)
ON_BN_CLICKED(ID_jisuan, Onjisuan)
ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
ON_BN_CLICKED(IDC_BUTTON4, OnButton4)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDIEDAI message handlers
void CDIEDAI::Onjisuan()
{
// TODO: Add your control notification handler code here
UpdateData(true);
char filterstr[]="像点像平面坐标文件(*.txt)|*.txt|All files(*.*)|*.*||";
CFileDialog dlg(true,"ori",NULL,OFN_HIDEREADONLY,filterstr,this);
if(dlg.DoModal()==IDCANCEL) return;
CString strPath=dlg.GetPathName();//获取文件路径
ifstream oriFile(LPCTSTR(strPath),ios::nocreate);
if(!oriFile) return;
oriFile>>m_shu;
CString s;
s.Format("%.6f", m_shu);
SetDlgItemText(IDC_shu,s);
//保存
static char BASED_CODE file[]="结果(*.TXT)|*.txt|保存结果(*.*)|*.*||";
CFileDialog SelectFile(FALSE, "txt", NULL,OFN_HIDEREADONLY
|OFN_OVERWRITEPROMPT,"Text Files(*.txt)|*.txt|All Files(*.*)|*.*||");
SelectFile.DoModal();
CString FileName;
FileName=SelectFile.GetPathName();
FILE *output;
output=fopen(FileName,"w");
fprintf(output," %-16s%-18s%-18s%-12s%-12s%-12s%-12s\n","点号","X","Y","Z","QX","QY","QZ");
angel_to_(m_Kappa_L,&m_Kappa_L1 );
angel_to_(m_Kappa_R,&m_Kappa_R1 );
angel_to_(m_Omega_L,&m_Omega_L1 );
angel_to_(m_Omega_R,&m_Omega_R1 );
angel_to_(m_Phi_L,&m_Phi_L1 );
angel_to_(m_Phi_R,&m_Phi_R1 );
for(int i=0;i<m_shu;i++)
{
oriFile>>m_numb;
oriFile>>m_x_L;
oriFile>>m_y_L;
oriFile>>m_x_R;
oriFile>>m_y_R;
double _m_x_L,_m_y_L,_m_x_R,_m_y_R,_m_F_L,_m_F_R;
_m_x_L=m_x_L/1000;
_m_y_L=m_y_L/1000;
_m_x_R=m_x_R/1000;
_m_y_R=m_y_R/1000;
_m_F_L=m_F_L/1000;
_m_F_R=m_F_R/1000;
double a11,a12,a13,b11,b12,b13,c11,c12,c13;
a11=cos(m_Phi_L1)*cos(m_Kappa_L1)-sin(m_Phi_L1)*sin(m_Omega_L1)*sin(m_Kappa_L1);
a12=-cos(m_Phi_L1)*sin(m_Kappa_L1)-sin(m_Phi_L1)*sin(m_Omega_L1)*cos(m_Kappa_L1);
a13=-sin(m_Phi_L1)*cos(m_Omega_L1);
b11=cos(m_Omega_L1)*sin(m_Kappa_L1);
b12=cos(m_Omega_L1)*cos(m_Kappa_L1);
b13=-sin(m_Omega_L1);
c11=sin(m_Phi_L1)*cos(m_Kappa_L1)+cos(m_Phi_L1)*sin(m_Omega_L1)*sin(m_Kappa_L1);
c12=-sin(m_Phi_L1)*sin(m_Kappa_L1)+cos(m_Phi_L1)*sin(m_Omega_L1)*cos(m_Kappa_L1);
c13=cos(m_Phi_L1)*cos(m_Omega_L1);
double a21,a22,a23,b21,b22,b23,c21,c22,c23;
a21=cos(m_Phi_R1)*cos(m_Kappa_R1)-sin(m_Phi_R1)*sin(m_Omega_R1)*sin(m_Kappa_R1);
a22=-cos(m_Phi_R1)*sin(m_Kappa_R1)-sin(m_Phi_R1)*sin(m_Omega_R1)*cos(m_Kappa_R1);
a23=-sin(m_Phi_R1)*cos(m_Omega_R1);
b21=cos(m_Omega_R1)*sin(m_Kappa_R1);
b22=cos(m_Omega_R1)*cos(m_Kappa_R1);
b23=-sin(m_Omega_R1);
c21=sin(m_Phi_R1)*cos(m_Kappa_R1)+cos(m_Phi_R1)*sin(m_Omega_R1)*sin(m_Kappa_R1);
c22=-sin(m_Phi_R1)*sin(m_Kappa_R1)+cos(m_Phi_R1)*sin(m_Omega_R1)*cos(m_Kappa_R1);
c23=cos(m_Phi_R1)*cos(m_Omega_R1);
double X0,Y0,Z0,m;
m=3000;
X0=m*_m_x_L+m_Xs_L;
Y0=m*_m_y_L+m_Ys_L;
Z0=m_Zs_L-m*_m_F_L;
// Z0=68.32;
double Q;
//double _m_x_L,_m_y_L,_m_x_R,_m_y_R;
double QX,QY,QZ;
for(int i=0;i<5;i++)
{
double _X_L,_Y_L,_Z_L,a_L11,a_L12,a_L13,a_L21,a_L22,a_L23;
_X_L=a11*(X0-m_Xs_L)+b11*(Y0-m_Ys_L)+c11*(Z0-m_Zs_L);
_Y_L=a12*(X0-m_Xs_L)+b12*(Y0-m_Ys_L)+c12*(Z0-m_Zs_L);
_Z_L=a13*(X0-m_Xs_L)+b13*(Y0-m_Ys_L)+c13*(Z0-m_Zs_L);
a_L11=(a11*_m_F_L+a13*(_m_x_L-m_X0_L))/_Z_L;
a_L12=(b11*_m_F_L+b13*(_m_x_L-m_X0_L))/_Z_L;
a_L13=(c11*_m_F_L+c13*(_m_x_L-m_X0_L))/_Z_L;
a_L21=(a12*_m_F_L+a13*(_m_y_L-m_Y0_L))/_Z_L;
a_L22=(b12*_m_F_L+b13*(_m_y_L-m_Y0_L))/_Z_L;
a_L23=(c12*_m_F_L+c13*(_m_y_L-m_Y0_L))/_Z_L;
double _X_R,_Y_R,_Z_R,a_R11,a_R12,a_R13,a_R21,a_R22,a_R23;
_X_R=a21*(X0-m_Xs_R)+b21*(Y0-m_Ys_R)+c21*(Z0-m_Zs_R);
_Y_R=a22*(X0-m_Xs_R)+b22*(Y0-m_Ys_R)+c22*(Z0-m_Zs_R);
_Z_R=a23*(X0-m_Xs_R)+b23*(Y0-m_Ys_R)+c23*(Z0-m_Zs_R);
a_R11=(a21*_m_F_R+a23*(_m_x_R-m_X0_R))/_Z_R;
a_R12=(b21*_m_F_R+b23*(_m_x_R-m_X0_R))/_Z_R;
a_R13=(c21*_m_F_R+c23*(_m_x_R-m_X0_R))/_Z_R;
a_R21=(a22*_m_F_R+a23*(_m_y_R-m_Y0_R))/_Z_R;
a_R22=(b22*_m_F_R+b23*(_m_y_R-m_Y0_R))/_Z_R;
a_R23=(c22*_m_F_R+c23*(_m_y_R-m_Y0_R))/_Z_R;
double AA[4][3],AAT[3][4],DX[3],LL[4],B[3][3],C[3][4];
//double _X0_L,_Y0_L,_X0_R,_Y0_R;
AA[0][0]=-a_L11;
AA[0][1]=-a_L12;
AA[0][2]=-a_L13;
AA[1][0]=-a_L21;
AA[1][1]=-a_L22;
AA[1][2]=-a_L23;
AA[2][0]=-a_R11;
AA[2][1]=-a_R12;
AA[2][2]=-a_R13;
AA[3][0]=-a_R21;
AA[3][1]=-a_R22;
AA[3][2]=-a_R23;
LL[0]=_m_x_L-(m_X0_L-_m_F_L*(_X_L/_Z_L));
LL[1]=_m_y_L-(m_Y0_L-_m_F_L*(_Y_L/_Z_L));
LL[2]=_m_x_R-(m_X0_R-_m_F_R*(_X_R/_Z_L));
LL[3]=_m_y_R-(m_Y0_R-_m_F_R*(_Y_R/_Z_L));
TranMatrix(&AA[0][0], &AAT[0][0], 4, 3);
MultMatrix(&AAT[0][0], &AA[0][0],&B[0][0] ,3, 4, 3);
InverMatrix( &B[0][0], 3);
MultMatrix(&B[0][0], &AAT[0][0],&C[0][0], 3, 3, 4);
MultMatrix(&C[0][0], LL,DX ,3, 4, 1);
double V[4],VT[4],V_V,E[4];
MultMatrix(&AA[0][0], &DX[0],E ,4, 3, 1);
SubMatrix(E, LL, V, 4, 1);
TranMatrix(V, VT, 4, 1);
MultMatrix(VT, V , &V_V ,1, 4, 1);
Q=sqrt(V_V/2);
X0=DX[0]+X0;
Y0=DX[1]+Y0;
Z0=DX[2]+Z0;
if(fabs(DX[0])<0.05&&fabs(DX[1])<0.05&&fabs(DX[2])<0.05)
{
MultMatrix(&AAT[0][0], &AA[0][0],&B[0][0] ,3, 4, 3);
QX=sqrt(B[0][0])*Q;
QY=sqrt(B[1][1])*Q;
QZ=sqrt(B[2][2])*Q;
break;
}
}
m_X=Y0;
m_Y=X0; //注意左右手坐标系
m_Z=Z0;
m_QX=QY;
m_QY=QX;
m_QZ=QZ;
fprintf(output,"%.0lf %lf %lf %lf %g %g %g\n",m_numb,m_X,m_Y,m_Z,m_QX,m_QY,m_QZ);
}
UpdateData(false);
oriFile.close();
fclose(output);
}
void CDIEDAI ::angel_to_(CString A,double *_B )
{
double pi;
pi=3.14159265;
CString temp,s;
temp = A;
s = "";
double a,b,c;
int j,flg;
flg=0;
j=0;
for(int i=0;i<temp.GetLength();i++)
{
if(temp[i]=='-')
{
flg=1;
}
if(temp[i]=='.')
{
j=i;
a=atoi(s);
//break;
}
s+=temp[i];
if(j!=0)
{
s="";
s+=temp[j+1];
s+=temp[j+2];
b=atoi(s);
s="";
s+=temp[j+3];
s+=temp[j+4];
c=atoi(s);
break;
}
}
if(flg==1)
{
*_B=(a+(-b/60)+(-c/3600))*pi/180;
}
else
{
*_B=(a+(b/60)+(c/3600))*pi/180;
}
}
void CDIEDAI::OnButton3()
{
// TODO: Add your control notification handler code here
char filterstr[]="外方位元素文件(*.txt)|*.txt|All files(*.*)|*.*||";
CFileDialog dlg(true,"ori",NULL,OFN_HIDEREADONLY,filterstr,this);
if(dlg.DoModal()==IDCANCEL) return;
CString strPath=dlg.GetPathName();//获取文件路径
ifstream oriFile(LPCTSTR(strPath),ios::nocreate);
if(!oriFile) return;
double P_L,O_L,K_L;
oriFile>>m_F_L;
oriFile>>m_X0_L;
oriFile>>m_Y0_L;
oriFile>>P_L;
oriFile>>O_L;
oriFile>>K_L;
oriFile>>m_Xs_L;
oriFile>>m_Ys_L;
oriFile>>m_Zs_L;
CString s;
s.Format("%.6f", m_F_L);
SetDlgItemText(IDC_F_L,s);
s.Format("%.6f", m_X0_L);
SetDlgItemText(IDC_X0_L,s);
s.Format("%.6f", m_Y0_L);
SetDlgItemText(IDC_Y0_L,s);
s.Format("%.6f",P_L);
SetDlgItemText(IDC_Phi_L,s);
s.Format("%.6f", O_L);
SetDlgItemText(IDC_Omega_L,s);
s.Format("%.6f", K_L);
SetDlgItemText(IDC_Kappa_L,s);
s.Format("%.6f", m_Xs_L);
SetDlgItemText(IDC_Xs_L,s);
s.Format("%.6f", m_Ys_L);
SetDlgItemText(IDC_Ys_L,s);
s.Format("%.6f", m_Zs_L);
SetDlgItemText(IDC_Zs_L,s);
oriFile.close();
}
void CDIEDAI::OnButton4()
{
// TODO: Add your control notification handler code here
char filterstr[]="外方位元素文件(*.txt)|*.txt|All files(*.*)|*.*||";
CFileDialog dlg(true,"ori",NULL,OFN_HIDEREADONLY,filterstr,this);
if(dlg.DoModal()==IDCANCEL) return;
CString strPath=dlg.GetPathName();//获取文件路径
ifstream oriFile(LPCTSTR(strPath),ios::nocreate);
if(!oriFile) return;
double P_R,O_R,K_R;
oriFile>>m_F_R;
oriFile>>m_X0_R;
oriFile>>m_Y0_R;
oriFile>>P_R;
oriFile>>O_R;
oriFile>>K_R;
oriFile>>m_Xs_R;
oriFile>>m_Ys_R;
oriFile>>m_Zs_R;
CString s;
s.Format("%.6f", m_F_R);
SetDlgItemText(IDC_F_R,s);
s.Format("%.6f", m_X0_R);
SetDlgItemText(IDC_X0_R,s);
s.Format("%.6f", m_Y0_R);
SetDlgItemText(IDC_Y0_R,s);
s.Format("%.6f",P_R);
SetDlgItemText(IDC_Phi_R,s);
s.Format("%.6f", O_R);
SetDlgItemText(IDC_Omega_R,s);
s.Format("%.6f", K_R);
SetDlgItemText(IDC_Kappa_R,s);
s.Format("%.6f", m_Xs_R);
SetDlgItemText(IDC_Xs_R,s);
s.Format("%.6f", m_Ys_R);
SetDlgItemText(IDC_Ys_R,s);
s.Format("%.6f", m_Zs_R);
SetDlgItemText(IDC_Zs_R,s);
oriFile.close();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -