【摄影测量学空间后方交会作业】求解程序






#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;
}

【摄影测量学空间后方交会作业】求解程序

时间: 2024-10-15 22:21:21

【摄影测量学空间后方交会作业】求解程序的相关文章

利用“三角化”计算行列式快速求解程序(验证过很多题目的,绝对准确)

#include<iostream>#include<cmath>using namespace std;void main(){ //输入行列式开始 int n,i,j,a[10][10],T[10],max[10],b[10],k,q,p; float t[10][10],c,sum=-1; cout<<"阶数:"; cin>>n; cout<<"行列式:"<<endl; for(i=1;i

表达式求解程序(CPP实现)

/** *    This is a program for solve mathematical expression. Just like: *            "1+4*3/2+22*(3+2*(3-4))" * *    To solve this problem, Let us see it by a view of priority. The rules as following: *        1). the priority of plus sign is 1

点堆中子动力学方程求解程序

我学的是核科学与技术专业,本科和硕士期间写了不少程序,如计算堆芯中子动力学的,计算流体力学的.但多数仅针对具体问题,通用性有些不足.硕士修了一门仿真技术的课程,我的作业是求解点堆中子动力学程序,靠这个还拿了优秀.觉得这个程序还蛮通用的,对于同专业的搞个大作业,或用于毕设等或许有帮助. 详细的推导.验证过程.程序代码见:https://github.com/ikheu/point_reactor 1.概述 计算中子通量密度的瞬变特性,对反应堆动力系统的运行安全分析与仿真而言十分重要.点堆中子动力学

作业——FoodTracker程序

作业及学习地址:https://developer.apple.com/library/content/referencelibrary/GettingStarted/DevelopiOSAppsSwift/index.html zoom:就理解为快速变大变小.reveal:显示.prompt:提示.pronounced:明显的. AppDelegate.swift文件有两个主要的功能: 创建了程序入口点,并且循环运行,传送输入事件到app中(由UIApplicationMain attribu

数独游戏求解程序

最近玩数独游戏,每行.每列.以及9宫格都包含1-9个数组.觉得这东西很适合用程序来求解.于是我就仿照中国象棋的暴力搜索算法(可参考我之前写的文章极大极小搜索算法),写了一个程序求解数独,直接贴代码了 /** * 模仿象棋程序的搜索算法,写一个求解数独的程序 * @author royhoo * */ public class ShuDu { private int[][] board; // 数独矩阵 private int zeroNum; // 缺失的数字个数 private int fil

第三周作业 --- 阅读程序

这周老师布置了一个阅读程序的作业. 问题如下: 阅读下面程序,请回答如下问题: 问题1:这个程序要找的是符合什么条件的数? 问题2:这样的数存在么?符合这一条件的最小的数是什么? 问题3:在电脑上运行这一程序,你估计多长时间才能输出第一个结果?时间精确到分钟(电脑:单核CPU 4.0G Hz,内存和硬盘等资源充足). 问题4:在多核电脑上如何提高这一程序的运行效率? using System; using System.Collections.Generic; using System.Text

2015年9月10日课程作业【程序包管理:rpm, yum】_JY1506402-19+liuhui880818

<Linux系统管理> (1)磁盘和文件系统管理: (2)RAID, LVM; btrfs; (3)程序包管理:rpm, yum(dnf) (4)Linux的网络管理; (5)进程和作业管理:htop, glances, tsar: (6)sed和awk: (7)Linux系统的开机启动流程: (8)内核基础知识,内核定制编译: (9)系统安装:kickstart, pxe 一.作业(练习)内容: 1.总结rpm和yum实现程序包的管理功能. 要求:作业要图文并茂 二.完成时间: 2015年9

操作系统中的作业、程序、进程、线程及管程

作业 作业是指用户在一次解题或一个事务处理过程中要求计算机系统所做工作的集合.它包括程序,数据及其作业说明书. 程序 程序是为解决一个信息处理任务而预先编制的工作执行方案,是由一串CPU能够执行的基本指令组成的序列,每一条指令规定了计算机应进行什么操作(如加.减.乘.判断等)及操作需要的有关数据. 进程 进程指是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位. 线程 线程是指线程是进程中的一个实体,是被系统独立调度和执行的基本单位. 管程 管程是指

[C++ Primer Plus] 第9章、内存模型和名称空间——(一)程序清单

程序清单9.11-13(名称空间示例) namesp.h 头文件:常量.结构定义.函数原型 1 //namesp.h 2 #include<string> 3 //creat the pers and debts namespace 4 namespace pers //包含Person结构的定义和两个函数原型 5 { 6 struct Person 7 { 8 std::string fname; 9 std::string lname; 10 }; 11 void getPerson(Pe