⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qianfangjiaohui1.cpp

📁 前方交会解算像点坐标
💻 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 + -