📄 qianfangjiaohui1.cpp
字号:
// qianfangjiaohui1.cpp : implementation file
//
#include "stdafx.h"
#include "qianfangjiaohui.h"
#include "qianfangjiaohui1.h"
#include "qianfangjiaohuiDoc.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
/////////////////////////////////////////////////////////////////////////////
// Cqianfangjiaohui dialog
Cqianfangjiaohui::Cqianfangjiaohui(CWnd* pParent /*=NULL*/)
: CDialog(Cqianfangjiaohui::IDD, pParent)
{
//{{AFX_DATA_INIT(Cqianfangjiaohui)
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;
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;
m_shu = 0;
//}}AFX_DATA_INIT
}
void Cqianfangjiaohui::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(Cqianfangjiaohui)
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);
DDX_Text(pDX, IDC_shu, m_shu);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(Cqianfangjiaohui, CDialog)
//{{AFX_MSG_MAP(Cqianfangjiaohui)
ON_BN_CLICKED(ID_jisuan, Onjisuan)
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// Cqianfangjiaohui message handlers
void Cqianfangjiaohui::Onjisuan()
{
// TODO: Add your control notification handler code here
UpdateData(true);
///角度转弧度
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 );
//打开像点像平面坐标文件
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");
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;
double L11,L12,L13,L1x,L14,L15,L16,L1y;
//系数阵
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);
L11=_m_F_L*a11+(_m_x_L-m_X0_L)*a13;
L12=_m_F_L*b11+(_m_x_L-m_X0_L)*b13;
L13=_m_F_L*c11+(_m_x_L-m_X0_L)*c13;
L1x=_m_F_L*a11*m_Xs_L+_m_F_L*b11*m_Ys_L+_m_F_L*c11*m_Zs_L+(_m_x_L-m_X0_L)*a13*m_Xs_L+
(_m_x_L-m_X0_L)*b13*m_Ys_L+(_m_x_L-m_X0_L)*c13*m_Zs_L;
L14=_m_F_L*a12+(_m_y_L-m_Y0_L)*a13;
L15=_m_F_L*b12+(_m_y_L-m_Y0_L)*b13;
L16=_m_F_L*c12+(_m_y_L-m_Y0_L)*c13;
L1y=_m_F_L*a12*m_Xs_L+_m_F_L*b12*m_Ys_L+_m_F_L*c12*m_Zs_L+(_m_y_L-m_Y0_L)*a13*m_Xs_L+
(_m_y_L-m_Y0_L)*b13*m_Ys_L+(_m_y_L-m_Y0_L)*c13*m_Zs_L;
double a21,a22,a23,b21,b22,b23,c21,c22,c23;
double L21,L22,L23,L2x,L24,L25,L26,L2y;
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);
L21=_m_F_R*a21+(_m_x_R-m_X0_R)*a23;
L22=_m_F_R*b21+(_m_x_R-m_X0_R)*b23;
L23=_m_F_R*c21+(_m_x_R-m_X0_R)*c23;
L2x=_m_F_R*a21*m_Xs_R+_m_F_R*b21*m_Ys_R+_m_F_R*c21*m_Zs_R+(_m_x_R-m_X0_R)*a23*m_Xs_R+
(_m_x_R-m_X0_R)*b23*m_Ys_R+(_m_x_R-m_X0_R)*c23*m_Zs_R;
L24=_m_F_R*a22+(_m_y_R-m_Y0_R)*a23;
L25=_m_F_R*b22+(_m_y_R-m_Y0_R)*b23;
L26=_m_F_R*c22+(_m_y_R-m_Y0_R)*c23;
L2y=_m_F_R*a22*m_Xs_R+_m_F_R*b22*m_Ys_R+_m_F_R*c22*m_Zs_R+(_m_y_R-m_Y0_R)*a23*m_Xs_R+
(_m_y_R-m_Y0_R)*b23*m_Ys_R+(_m_y_R-m_Y0_R)*c23*m_Zs_R;
double A1[4][3],A1T[3][4],B1[3][3],C1[3][4],L1[4];
double X11[3];
double X0,Y0,Z0;
A1[0][0]=L11;
A1[0][1]=L12;
A1[0][2]=L13;
A1[1][0]=L14;
A1[1][1]=L15;
A1[1][2]=L16;
A1[2][0]=L21;
A1[2][1]=L22;
A1[2][2]=L23;
A1[3][0]=L24;
A1[3][1]=L25;
A1[3][2]=L26;
L1[0]=L1x;
L1[1]=L1y;
L1[2]=L2x;
L1[3]=L2y;
//得到 X0 Y0 Z0
TranMatrix(&A1[0][0], &A1T[0][0], 4, 3);
MultMatrix(&A1T[0][0], &A1[0][0],&B1[0][0] ,3, 4, 3);
InverMatrix( &B1[0][0], 3);
MultMatrix(&B1[0][0], &A1T[0][0],&C1[0][0], 3, 3, 4);
MultMatrix(&C1[0][0], L1,X11 ,3, 4, 1);
X0=X11[0];
Y0=X11[1];
Z0=X11[2];
// 生成协方差矩阵
double AX[4],V[4],VT[4],V_V,Q;
MultMatrix(&A1[0][0], X11,AX,4, 3, 1);
SubMatrix(AX, L1, V, 4, 1);
TranMatrix(V, VT, 4, 1);
MultMatrix(VT, V , &V_V ,1, 4, 1);
Q=sqrt(V_V/2);
double QX,QY,QZ;
MultMatrix(&A1T[0][0], &A1[0][0],&B1[0][0] ,3, 4, 3);
QX=sqrt(B1[0][0])*Q;
QY=sqrt(B1[1][1])*Q;
QZ=sqrt(B1[2][2])*Q;
m_X=Y0;
m_Y=X0; //注意左右手坐标系
m_Z=Z0;
m_QX=QY;
m_QY=QX;
m_QZ=QZ;
///写数据
fprintf(output,"%.0lf %lf %lf %lf %lf %lf %lf\n",m_numb,m_X,m_Y,m_Z,m_QX,m_QY,m_QZ);
}
UpdateData(false);
oriFile.close();
fclose(output);
}
void Cqianfangjiaohui ::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);
}
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 Cqianfangjiaohui::OnButton1()
{
// 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 Cqianfangjiaohui::OnButton2()
{
// 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 + -