程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 【攝影測量學空間後方交會作業】求解程序

【攝影測量學空間後方交會作業】求解程序

編輯:C++入門知識

【攝影測量學空間後方交會作業】求解程序 圖片
圖片
圖片
圖片

#include <stdio.h> #include<cmath>
#include<iostream.h>
#include<fstream.h> int main()
{
 
    double NJZ(double sum[100][100],double l[10]);
 double x[10],y[10],X[10],Y[10],Z[10],d,D,m,f,T,R,S,r=0,s=0,t=0;
 ifstream   infile; //定義輸入文件類
 
 infile.open("測試_1.txt"); //打開一個輸入文件“file1.txt”
 for(int i=1;i<=4;i++)
 {
  for(int j=1;j<=5;j++)
  {
   switch(j)
   {
   case 1:infile>>x[i];break;
   case 2:infile>>y[i];break;
   case 3:infile>>X[i];break;
   case 4:infile>>Y[i];break;
   case 5:infile>>Z[i];break;
   }
   //infile>>a[i][j];//將“file1.txt”中的十個整型數輸入到a[i]中
  }
 }
    //for(i=1;i<=4;i++)
 //{
  //cout<<x[i]<<","<<y[i]<<","<<X[i]<<","<<Y[i]<<","<<Z[i]<<endl;
 //}
 //cout<<endl;
 infile.close();//關閉輸入文件
    d=sqrt(pow(x[1]-x[2],2)+pow(y[1]-y[2],2));
 //cout<<"d="<<d<<endl;
 D=sqrt(pow(X[1]-X[2],2)+pow(Y[1]-Y[2],2)+pow(Z[1]-Z[2],2));
 //cout<<"D="<<D<<endl;
 m=D/d;
 //cout<<"m="<<m<<endl;
    //cout<<"請輸入像片主距f(以mm為單位):";
 //cin>>f;
 f=153.24;
 T=m*f;
 //cout<<"T="<<T<<endl;
 R=0.25*(X[1]+X[2]+X[3]+X[4]);
    //cout<<"R="<<R<<endl;
 S=0.25*(Y[1]+Y[2]+Y[3]+Y[4]);
 //cout<<"S="<<S<<endl;
 cout<<"第一步:初始化的6個外方位元素分別為:"<<endl;
 cout<<"r=0"<<endl;
    cout<<"s=0"<<endl;
 cout<<"t=0"<<endl;
 cout<<"R="<<R<<endl;
 cout<<"S="<<S<<endl;
 cout<<"T="<<T<<endl;
 double a1,a2,a3,b1,b2,b3,c1,c2,c3;
 a1=cos(r)*cos(t)-sin(r)*sin(s)*sin(t);
 a2=-cos(r)*sin(t)-sin(r)*sin(s)*cos(t);
 a3=-sin(r)*cos(s);
 b1=cos(s)*sin(t);
 b2=cos(s)*cos(t);
 b3=-sin(s);
 c1=sin(r)*cos(t)+cos(r)*sin(s)*sin(t);
 c2=-sin(r)*sin(t)+cos(r)*sin(s)*cos(t);
 c3=cos(r)*cos(s);
 cout<<"第二步:旋轉矩陣計算成功,如下:"<<endl;
 cout<<"a1="<<a1<<"  "<<"a2="<<a2<<"  "<<"a3="<<a3<<endl;
 cout<<"b1="<<b1<<"  "<<"b2="<<b2<<"  "<<"b3="<<b3<<endl;
 cout<<"c1="<<c1<<"  "<<"c2="<<c2<<"  "<<"c3="<<c3<<endl;
 //逐點計算像點坐標的近似值 
 double u[5],v[5],U[5],V[5],W[5];
 for(i=1;i<=4;i++)
 {
  U[i]=a1*(X[i]-R)+b1*(Y[i]-S)+c1*(Z[i]-T);
  V[i]=a2*(X[i]-R)+b2*(Y[i]-S)+c2*(Z[i]-T);
  W[i]=a3*(X[i]-R)+b3*(Y[i]-S)+c3*(Z[i]-T);
  u[i]=-f*U[i]/W[i];
  v[i]=-f*V[i]/W[i];
 }
 cout<<"第三步:像點坐標近似值計算成功,如下:"<<endl;
 for(i=1;i<=4;i++)
 {
  cout<<"("<<u[i]<<","<<v[i]<<")"<<endl;
 }
 //計算系數矩陣
 double a[10][10];
 for(i=1;i<=4;i++)
 {
  a[2*i-1][1]=(a1*f+a3*x[i])/W[i];
  a[2*i-1][2]=(b1*f+b3*x[i])/W[i];
  a[2*i-1][3]=(c1*f+c3*x[i])/W[i];
  a[2*i-1][4]=y[i]*sin(s)-cos(s)*(x[i]*(x[i]*cos(t)-y[i]*sin(t))/f+f*cos(t));
  a[2*i-1][5]=-f*sin(t)-x[i]*(x[i]*sin(t)+y[i]*cos(t))/f;
  a[2*i-1][6]=y[i];
  a[2*i][1]=(a2*f+a3*y[i])/W[i];
  a[2*i][2]=(b2*f+b3*y[i])/W[i];
  a[2*i][3]=(c2*f+c3*y[i])/W[i];
  a[2*i][4]=-x[i]*sin(s)-cos(s)*(y[i]*(x[i]*cos(t)-y[i]*sin(t))/f-f*sin(t));
  a[2*i][5]=-f*cos(t)-y[i]*(x[i]*sin(t)+y[i]*cos(t))/f;
  a[2*i][6]=-x[i];
 }
 cout<<"第四步:系數矩陣計算結束,如下:"<<endl;
 for(i=1;i<=4;i++)
 {
  cout<<a[2*i-1][1]<<" "<<a[2*i-1][2]<<" "<<a[2*i-1][3]<<" "<<a[2*i-1][4]<<" "<<a[2*i-1][5]<<" "<<a[2*i-1][6]<<endl;
        cout<<a[2*i][1]<<" "<<a[2*i][2]<<" "<<a[2*i][3]<<" "<<a[2*i][4]<<" "<<a[2*i][5]<<" "<<a[2*i][6]<<endl;
 }
 //計算常數項
 double l[10];
 for(i=1;i<=8;i++)
 {
  l[2*i-1]=x[i]-u[i];
  l[2*i]=y[i]-v[i];
 }
 cout<<"第四步:常數項矩陣計算結束,如下:"<<endl;
 for(i=1;i<=8;i++)
 {
  cout<<l[i]<<endl;
 }
 //求系數矩陣的轉置
 int q=0;
 double sum[100][100],A[100][100];
 for(i=1;i<=8;i++)
 {
  for(int j=1;j<=6;j++)
  {
   A[j][i]=a[i][j];
  }
 }
 cout<<"第五步:系數矩陣轉置結果如下:"<<endl;
 for(i=1;i<=6;i++)
 {
  for(int j=1;j<=8;j++)
  {
   cout<<A[i][j]<<"  ";
  }
  cout<<endl;
 }
 //求系數矩陣與其轉置矩陣的乘積
 for(i=1;i<=6;i++)
 {
  for(int k=1;k<=6;k++)
  {
   sum[i][k]=0;
   for(int j=1;j<=8;j++)
   {
    sum[i][k]=sum[i][k]+A[i][j]*a[j][k];
   }
  }
 }
 cout<<"第六步:系數矩陣與其轉置矩陣的乘積結果如下:"<<endl;
 for(i=1;i<=6;i++)
 {
  for(int j=1;j<=6;j++)
  {
   cout<<sum[i][j]<<"  ";
  }
  cout<<endl<<endl<<endl;
 }
 //求系數矩陣與常數項矩陣的乘積
 double mun[10];
 for(i=1;i<=6;i++)
 {
  mun[i]=0;
  for(int j=1;j<=8;j++)
  {
   mun[i]=mun[i]+A[i][j]*l[j];
  }
 }
 cout<<"第七步:系數矩陣與常數項矩陣的乘積結果如下:"<<endl;
 for(i=1;i<=6;i++)
 {
  cout<<mun[i]<<endl;
 }
 NJZ(sum,l);
    return 0; 
}
double NJZ(double sum[100][100],double l[10])
{
 int i,j,n=6,q,k,c=0;
 double A[100],C[100][100],B[100][100],G[100][100],K[10];
 for(i=1;i<=n;i++)
 {
  for(j=n+1;j<=2*n;j++)
  {
   //判斷
   if(i==j-n)
   {
    sum[i][j]=1;
   }
   else
   {
    sum[i][j]=0;
   }
  }
 }
// cout<<"第一步:為原矩陣配單位矩陣結果如下:"<<endl;
// for(i=1;i<=n;i++)
// {
//  for(j=1;j<=2*n;j++)
//  {
//   cout<<sum[i][j]<<"  ";
//  }
//  cout<<endl;
// }
 for(j=1;j<=n;j++)//列
 {
  for(i=1;i<=n;i++)
  {
   if(i!=j)
   {
    if(sum[i][j]!=0)
    {
     for(k=1;k<=2*n;k++)
     {
      B[i][k]=sum[i][k]-sum[j][k]*sum[i][j]/sum[j][j];
     }
     for(k=1;k<=2*n;k++)
     {
      sum[i][k]=B[i][k];
     }
    }
   }
   else
   {
    if(sum[i][j]==0)//若對角線上的=0
    {
     for(q=1;q<=n;q++)//從第1行找起,找到不為0的行與其交換
     {
      if(sum[q][j]!=0)
      {
       for(k=1;k<=2*n;k++)
       {
        c++;
        A[k]=sum[i][k];
        sum[i][k]=sum[q][k];
        sum[q][k]=A[k];
       }
       break;
      }
     }
    }
   }
   //if(j==3&&i==3)
   //{
   // cout<<a[1][1]<<" "<<a[1][2]<<" "<<a[1][3]<<" "<<a[1][4]<<" "<<a[1][5]<<" "<<a[1][6]<<endl;
   // cout<<a[2][1]<<" "<<a[2][2]<<" "<<a[2][3]<<" "<<a[2][4]<<" "<<a[2][5]<<" "<<a[2][6]<<endl;
   // cout<<a[3][1]<<" "<<a[3][2]<<" "<<a[3][3]<<" "<<a[3][4]<<" "<<a[3][5]<<" "<<a[3][6]<<endl;
   //}
  }
 }
 for(j=1;j<=n;j++)
 {
  if(sum[j][j]!=1)
  {
   for(k=1;k<=2*n;k++)
   {
    sum[j][k]=sum[j][k]/sum[j][j];
   }
  }
 }
 cout<<"第八步:求系數矩陣與其逆矩陣的乘積的逆矩陣結果如下:"<<endl;
 for(i=1;i<=n;i++)
 {
  for(j=1;j<=2*n;j++)
  {
   if(sum[i][j]<0.00001)
   {
    sum[i][j]=0;
   }
  }
 }
 for(i=1;i<=n;i++)
 {
  for(j=1;j<=n;j++)
  {
   G[i][j]=sum[i][j+n];
  }
 }
 for(i=1;i<=n;i++)
 {
  for(j=1;j<=n;j++)
  {
   cout<<G[i][j]<<"  ";
  }
  cout<<endl<<endl;
 }
 //求解6個外方位元素的改正數
 for(i=1;i<=6;i++)
 {
  K[i]=0;
  for(j=1;j<=6;j++)
  {
   K[i]=K[i]+G[i][j]*l[j];
  }
 }
 cout<<"第九步:6個外方位元素的改正數結果如下:"<<endl;
 for(i=1;i<=6;i++)
 {
  cout<<K[i]<<endl;
 }
    return 0;
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved