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

📄 空间后方交会.cpp

📁 空间后方交会
💻 CPP
字号:
// 空间后方交会.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "stdio.h"
#include "math.h"
#include "iostream.h"
#define N 4
#define M 2*N

void Transpose(double a[M][6],double b[6][M])
{
	int i,j;
	for(i=0;i<6;i++)
	  for(j=0;j<M;j++)
	  {
	  	b[i][j]=a[j][i];
	  }
}
void Matrix_Times1(double a[6][M],double b[M][6],double c[6][6])
{	
	int i,j,k;
    for(i=0;i<6;i++)
    for(j=0;j<6;j++)
	{    c[i][j]=0;
		for(k=0;k<2*N;k++)
        c[i][j]+=a[i][k]*b[k][j];
	}
	
}
void Matrix_Times2(double a[6][M],double b[M][1],double c[6][1])
{	
	int i,j,k;
    for(i=0;i<6;i++)
    for(j=0;j<1;j++)
	{    c[i][j]=0;
		for(k=0;k<2*N;k++)
        c[i][j]+=a[i][k]*b[k][j];
	}
	
}
void Matrix_Times3(double a[6][6],double b[6][1],double c[6][1])
{	
	int i,j,k;
    for(i=0;i<6;i++)
    for(j=0;j<1;j++)
	{   c[i][j]=0;
		for(k=0;k<6;k++)
        c[i][j]+=a[i][k]*b[k][j];
	}
	
}
//计算逆矩阵
double js(double s[6][6],int n) 
{
	int z,j,k; 
    double b[6][6],r,total=0;             //b[M][M]用于存放,在矩阵s[N][N]中元素s[0]的余子式 
    if(n>2)
    {
     	for(z=0;z<n;z++) 
     {
    	for(j=0;j<n-1;j++) 
        for(k=0;k<n-1;k++) 
        if(k>=z) b[j][k]=s[j+1][k+1]; 
        else b[j][k]=s[j+1][k]; 
        if(z%2==0) r=s[0][z]*js(b,n-1);       //递归调用
        else  r=(-1)*s[0][z]*js(b,n-1); 
        total=total+r; 
     } 
    } 
    else if(n==2) total=s[0][0]*s[1][1]-s[0][1]*s[1][0]; 
    return total; 
} 
void juzhen_ni(double s[6][6],double b[6][6],int n) 
{
	int z,j,k,l,m,g; 
	double a[6][6],r,temp;
    for(z=0;z<n;z++) 
   {
		l=z; 
    for(j=0;j<n;j++) 
	{
		m=j; 
       for (k=0;k<n-1;k++) 
        for(g=0;g<n-1;g++) 
		{ 
			if(g>=m&&k<l) a[k][g]=s[k][g+1]; 
             else if(k>=l&&g<m)  a[k][g]=s[k+1][g]; 
             else if(k>=l&&g>=m) a[k][g]=s[k+1][g+1]; 
             else a[k][g]=s[k][g]; 
		} 
         b[z][j]=js(a,n-1); 
	} 
   }
     r=js(s,6);
     for(z=0;z<6;z++)               //求代数余子式,此时b[M][M]中存放的为原矩阵各元素对应的"代数余子式" 
          for(j=0;j<6;j++) 
              if((z+j)%2!=0 && b[z][j]!=0) b[z][j]=-b[z][j]; 
          for(z=0;z<6;z++)        //对b[M][M]转置,此时b[M][M]中存放的为原矩阵的伴随矩阵
           for(j=z+1;j<6;j++) 
		   {
			   temp=b[z][j]; 
               b[z][j]=b[j][z]; 
               b[j][z]=temp; 
		   }
  
     for(z=0;z<6;z++)         //*求逆矩阵,此时b[M][M]中存放的是原矩阵的逆矩阵
          for(j=0;j<6;j++) 
              b[z][j]=b[z][j]/r; 
} 

int main(int argc, char* argv[])
{
	int i,m,j;
	double t,w,k,Xs0,Ys0,Zs0,f,S1=0.0,S2=0.0,m0=0;;
	double x[N],y[N],X[N],Y[N],G[N],Z[N],a[3],b[3],c[3],xo[N],yo[N],l[M][1],A[M][6],B[6][M],C[6][6],D[6][1],E[6][6],T[6][1]={{0},{0},{0},{1},{1},{1}},V[M][1];

   for(i=0;i<N;i++)
	{
		cout<<"请输入第"<<(i+1)<<"个点的影像坐标 x y(mm):"<<endl;
		cin>>x[i]>>y[i];
		cout<<"请输入第"<<(i+1)<<"个点的地面坐标 X Y Z(m)"<<endl;
		cin>>X[i]>>Y[i]>>Z[i];
		S1+=X[i];
		S2+=Y[i];
	}
	

  	for(i=0;i<N;i++)
	{
		x[i]/=1000.0;
	    y[i]/=1000.0;
	}
    t=w=k=0.0;
	m=50000;
	f=0.15324;
	Xs0=S1/N;
	Ys0=S2/N;
    Zs0=m*f;

  while(fabs(T[3][0])>=0.000029||fabs(T[4][0])>=0.000029||fabs(T[5][0])>=0.000029)
	{
    a[0]=cos(t)*cos(k)-sin(t)*sin(w)*sin(k);
	a[1]=-cos(t)*sin(k)-sin(t)*sin(w)*cos(k);
	a[2]=-sin(t)*cos(w);
	b[0]=cos(w)*sin(k);
	b[1]=cos(w)*cos(k);
	b[2]=-sin(w);
	c[0]=sin(t)*cos(k)+cos(t)*sin(w)*sin(k);
	c[1]=-sin(t)*sin(k)+cos(t)*sin(w)*cos(k);
	c[2]=cos(t)*cos(w);

    for(i=0;i<N;i++)
	{
		xo[i]=-f*(a[0]*(X[i]-Xs0)+b[0]*(Y[i]-Ys0)+c[0]*(Z[i]-Zs0))/(a[2]*(X[i]-Xs0)+b[2]*(Y[i]-Ys0)+c[2]*(Z[i]-Zs0));
		yo[i]=-f*(a[1]*(X[i]-Xs0)+b[1]*(Y[i]-Ys0)+c[1]*(Z[i]-Zs0))/(a[2]*(X[i]-Xs0)+b[2]*(Y[i]-Ys0)+c[2]*(Z[i]-Zs0));
        G[i]=a[2]*(X[i]-Xs0)+b[2]*(Y[i]-Ys0)+c[2]*(Z[i]-Zs0);
	}

    for(i=0;i<N;i++)
	{
	     A[2*i][0]=(a[0]*f+a[2]*x[i])/G[i];
		 A[2*i][1]=(b[0]*f+b[2]*x[i])/G[i];
		 A[2*i][2]=(c[0]*f+c[2]*x[i])/G[i];
		 A[2*i][3]=y[i]*sin(w)-(x[i]*(x[i]*cos(k)-y[i]*sin(k))/f+f*cos(k))*cos(w);
		 A[2*i][4]=-f*sin(k)-x[i]*(x[i]*sin(k)+y[i]*cos(k))/f;
		 A[2*i][5]=y[i];
		 A[2*i+1][0]=(a[1]*f+a[2]*y[i])/G[i];
		 A[2*i+1][1]=(b[1]*f+b[2]*y[i])/G[i];
		 A[2*i+1][2]=(c[1]*f+c[2]*y[i])/G[i];
		 A[2*i+1][3]=-x[i]*sin(w)-(y[i]*(x[i]*cos(k)-y[i]*sin(k))/f-f*sin(k))*cos(w);
		 A[2*i+1][4]=-f*cos(k)-y[i]*(x[i]*sin(k)+y[i]*cos(k))/f;
		 A[2*i+1][5]=-x[i];

		 l[2*i][0]=x[i]-xo[i];
	     l[2*i+1][0]=y[i]-yo[i];
	}
	
Transpose(A,B);

Matrix_Times1(B,A,C);

Matrix_Times2(B,l,D);

juzhen_ni(C,E,6);

Matrix_Times3(E,D,T);


   Xs0+=T[0][0];
   Ys0+=T[1][0];
   Zs0+=T[2][0];
   t+=T[3][0];
   w+=T[4][0];
   k+=T[5][0];
	}
  
  cout.setf(ios::fixed);
  cout.setf(ios::showpoint);
  cout.precision(2);

   cout<<"像主点的空间坐标为:"<<endl;	  
   cout<<"Xs="<<Xs0<<endl;
   cout<<"Ys="<<Ys0<<endl;
   cout<<"Zs="<<Zs0<<endl;

    a[0]=cos(t)*cos(k)-sin(t)*sin(w)*sin(k);
	a[1]=-cos(t)*sin(k)-sin(t)*sin(w)*cos(k);
	a[2]=-sin(t)*cos(w);
	b[0]=cos(w)*sin(k);
	b[1]=cos(w)*cos(k);
	b[2]=-sin(w);
	c[0]=sin(t)*cos(k)+cos(t)*sin(w)*sin(k);
	c[1]=-sin(t)*sin(k)+cos(t)*sin(w)*cos(k);
	c[2]=cos(t)*cos(w);

  cout.setf(ios::fixed);
  cout.setf(ios::showpoint);
  cout.precision(5);

   cout<<"旋转矩阵R为:"<<endl;
   cout<<"a1="<<a[0]<<",a2="<<a[1]<<",a3="<<a[2]<<endl;
   cout<<"b1="<<b[0]<<",b2="<<b[1]<<",b3="<<b[2]<<endl;
   cout<<"c1="<<c[0]<<",c2="<<c[1]<<",c3="<<c[2]<<endl;

  cout.setf(ios::fixed);
  cout.setf(ios::showpoint);
  cout.precision(6);

  cout<<"外方位角元素的限差为:"<<endl;
  cout<<"dy="<<T[3][0]<<endl;
    cout<<"dw="<<T[4][0]<<endl;
	  cout<<"dk="<<T[5][0]<<endl;
   
	  for(i=0;i<M;i++)
       for(j=0;j<1;j++)
	   {
	     V[i][j]=0;
	     for(int k=0;k<6;k++)
		 V[i][j]=A[i][k]*T[k][j];
	   }

   for(i=0;i<M;i++)
   {
	   V[i][0]-=l[i][0];
	   m0+=V[i][0]*V[i][0];
	  }
   m0=sqrt(m0/(2*N-6));

   cout<<"单位权中误差为:";
   cout<<m0<<endl;
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -