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

📄 后方交会.cpp

📁 编写一个完整的单片空间后方交会程序
💻 CPP
字号:
#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])   //将矩阵a[]转置,存储在b[]中
{
	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];//c[][]存放矩阵的乘积
 }
 
}
//计算逆矩阵
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;
 int  nCount=0;
double n=0.0;
 double t,w,k,Xs0,Ys0,Zs0,f,S1=0.0,S2=0.0;
 double jd[6];
 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];
cout<<"请输入摄影比例尺:"<<endl;

cin>>m;
cout<<endl;
cout<<"请输入主焦距:"<<endl;
cin>>f;
cout<<endl;
   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.000001||fabs(T[4][0])>=0.000001||fabs(T[5][0])>=0.000001) //控制输出精度
 {
 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);//y[i]的分子

 }

    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];
   nCount++;

 }
//函数调用
 
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(3);

   cout<<"像主点的空间坐标为:"<<endl;   
   cout<<"Xs="<<Xs0<<endl;
   cout<<"Ys="<<Ys0<<endl;
   cout<<"Zs="<<Zs0<<endl;
   cout<<"角元素为:"<<endl;
   cout<<"φ="<<t<<endl;
   cout<<"ω="<<w<<endl;  
   cout<<"κ="<<k<<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(10);

  cout<<"外方位角元素的限差为:"<<endl;
  cout<<"dy="<<T[3][0]<<endl;
    cout<<"dw="<<T[4][0]<<endl;
   cout<<"dk="<<T[5][0]<<endl;
 

   for(i=0;i<N;i++)
   {
    V[2*i][0]=A[2*i][0]*T[0][0]+A[2*i][1]*T[1][0]+A[2*i][2]*T[2][0]+A[2*i][3]*T[3][0]+A[2*i][4]*T[4][0]+A[2*i][5]*T[5][0]-l[2*i][0];
       V[2*i+1][0]=A[2*i+1][0]*T[0][0]+A[2*i+1][1]*T[1][0]+A[2*i+1][2]*T[2][0]+A[2*i+1][3]*T[3][0]+A[2*i+1][4]*T[4][0]+A[2*i+1][5]*T[5][0]-l[2*i+1][0];
      n+=V[2*i][0]*V[2*i][0]+V[2*i+1][0]*V[2*i+1][0];
	     //nCount++;
   }   
   n=sqrt(n/(2*N-6));

   cout<<"单位权中误差m0为:";
   cout<<n<<endl;
   cout<<"Xs,Ys,ZS,φ,ω,κ的精度分别为:"<<endl;
   for(i=0;i<6;i++)
   {
	   jd[i]=(sqrt(E[i][i]))*n;
	   
       cout<<"第"<<i+1<<"个外方位元素的精度为:"<<jd[i]<<endl;
   }
   
   cout<< "迭代次数为:"<<nCount<<endl;
 return 0;
}

⌨️ 快捷键说明

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