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

📄 diedai.cpp

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