空间后方交会程序Word文件下载.docx
- 文档编号:22713109
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:13
- 大小:35.45KB
空间后方交会程序Word文件下载.docx
《空间后方交会程序Word文件下载.docx》由会员分享,可在线阅读,更多相关《空间后方交会程序Word文件下载.docx(13页珍藏版)》请在冰豆网上搜索。
(6)逐点计算误差方程式的系数和常数项,组成误差方程式。
(7)计算法方程的系数矩阵
和常数项
,组成法方程式。
(8)解法方程,求得外方位元素的改正数
,
,dφ,dω,dκ。
(9)用前次迭代取得的近似值,加本次迭代的改正数,计算外方位元素的新值。
(10)将求得的外方位元素改正数与规定的限差比较,若小于限差则迭代结束。
否则用新的近似值重复(4)~(9),直到满足要求为止。
四.实验结果:
程序的源代码如下所示:
#include<
stdio.h>
stdlib.h>
malloc.h>
math.h>
conio.h>
#defineN4
voidturn(double*A,doubleA2[],intm,intn)//计算矩阵的转置
{
inti,j;
for(i=0;
i<
m;
i++)
for(j=0;
j<
n;
j++)
A2[j*m+i]=A[i*n+j];
}
voidmulAB(double*A,double*B,double*C,intam,intan,intbm,intbn)//计算两矩阵相乘
inti,j,l,u;
if(an!
=bm)
{
printf("
error!
cannotdothemultiplication.\n"
);
return;
}
am;
bn;
{
u=i*bn+j;
C[u]=0.0;
for(l=0;
l<
an;
l++)
C[u]+=A[i*an+l]*B[l*bn+j];
}
double*inv(double*a,intn)//计算矩阵的逆,本程序的难点
{//采用高斯-约旦-全选主元法
int*is,*js,i,j,k,l,u,v;
doubled,p;
is=(int*)malloc(n*sizeof(int));
js=(int*)malloc(n*sizeof(int));
for(k=0;
k<
=n-1;
k++)
{
d=0.0;
for(i=k;
for(j=k;
{l=i*n+j;
p=fabs(a[l]);
if(p>
d)
{
d=p;
is[k]=i;
js[k]=j;
}
if(d+1.0==1.0)
{free(is);
free(js);
errornotinv\n"
returnNULL;
if(is[k]!
=k)
for(j=0;
{u=k*n+j;
v=is[k]*n+j;
p=a[u];
a[u]=a[v];
a[v]=p;
if(js[k]!
for(i=0;
{u=i*n+k;
v=i*n+js[k];
l=k*n+k;
a[l]=1.0/a[l];
if(j!
u=k*n+j;
a[u]=a[u]*a[l];
if(i!
{u=i*n+j;
a[u]=a[u]-a[i*n+k]*a[k*n+j];
a[u]=-a[u]*a[l];
}
for(k=n-1;
k>
=0;
k--)
{if(js[k]!
v=js[k]*n+j;
v=i*n+is[k];
free(is);
free(js);
returna;
voidprintmatrix(doubleM[],intm,intn)//矩阵的输出
printf("
%.5f"
M[i*n+j]);
\n"
printf("
main()//主函数,空间后方交会的计算
FILE*fp;
//定义一个文件指针fp
intm,i,j=0;
doublef,t,w,k,S1=0.0,S2=0.0,S3=0.0,x[N],y[N],x0[N],y0[N],X[N],Y[N],Z[N],Xs0,Ys0,Zs0;
doublea[3],b[3],c[3],A[2*N*6],AT[6*2*N],ATA[6*6],*ATA_=NULL,l[2*N],ATl[6],V[6];
if((fp=fopen("
e:
\\shuju.txt"
"
r"
))==NULL)//使fp指向被打开的shuju.txt文件
{//并判断文件是否打开成功
\nerroronopenshuju.txt\n"
getch();
exit
(1);
N;
fscanf(fp,"
%lf%lf%lf%lf%lf"
&
x[i],&
y[i],&
X[i],&
Y[i],&
Z[i]);
//将文件中的数据赋给主函数定义的变量
原始数据:
x\t\ty\t\t\X\t\tY\t\tZ\t\t\n"
//输出文件中的原始数据
%lf%lf%lf%lf%lf\n"
x[i],y[i],X[i],Y[i],Z[i]);
\n请输入摄影机主距和摄影比例尺分母;
f,m:
"
scanf("
%lf,%lf"
f,&
m);
//输入f,m
f=f/1000.0;
x[i]/=1000.0;
y[i]/=1000.0;
S1+=X[i];
S2+=Y[i];
S3+=Z[i];
Xs0=S1/N;
Ys0=S2/N;
//计算外方位元素的初始值
Zs0=m*f+S3/N;
t=0.0;
w=0.0;
k=0.0;
while(j<
3)
---------------------------------第%d次计算------------------------------\n"
j+1);
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);
x0[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));
//计算像点坐标近似值
y0[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);
A[i*12+0]=(a[0]*f+a[2]*x[i])/G[i];
A[i*12+1]=(b[0]*f+b[2]*x[i])/G[i];
A[i*12+2]=(c[0]*f+c[2]*x[i])/G[i];
A[i*12+3]=y[i]*sin(w)-(x[i]*(x[i]*cos(k)-y[i]*sin(k))/f+f*cos(k))*cos(w);
//计算误差方程的系数阵以及l
A[i*12+4]=-f*sin(k)-x[i]*(x[i]*sin(k)+y[i]*cos(k))/f;
A[i*12+5]=y[i];
A[i*12+6]=(a[1]*f+a[2]*y[i])/G[i];
A[i*12+7]=(b[1]*f+b[2]*y[i])/G[i];
A[i*12+8]=(c[1]*f+c[2]*y[i])/G[i];
A[i*12+9]=-x[i]*sin(w)-(y[i]*(x[i]*cos(k)-y[i]*sin(k))/f-f*sin(k))*cos(w);
A[i*12+10]=-f*cos(k)-y[i]*(x[i]*sin(k)+y[i]*cos(k))/f;
A[i*12+11]=-x[i];
l[i*2+0]=x[i]-x0[i];
l[i*2+1]=y[i]-y0[i];
//printf("
outputmatrix:
A\n"
//printmatrix(A,2*N,6);
l\n"
//printmatrix(l,2*N,1);
turn(A,AT,2*N,6);
AT\n"
//printmatrix(AT,6,2*N);
mulAB(AT,A,ATA,6,2*N,2*N,6);
//间接平差法计算外方位元素,中间计算的矩阵可以根据需要
ATA\n"
//选择性的输出,这里将其屏蔽,为了在打印输出结果的时候
//printmatrix(ATA,6,6);
//节约资源
ATA_=inv(ATA,6);
ATA_\n"
//printmatrix(ATA_,6,6);
mulAB(AT,l,ATl,6,2*N,2*N,1);
outpitmatrinx:
ATl\n"
//printmatrix(ATl,6,1);
mulAB(ATA_,ATl,V,6,6,6,1);
V\n"
//printmatrix(V,6,1);
Xs0+=V[0];
Ys0+=V[1];
Zs0+=V[2];
t+=V[3];
w+=V[4];
k+=V[5];
第%d次计算的外方位元素为:
++j);
Xs=%.5lf,Ys=%.5lf,Zs=%.5lf,t=%.5lf,w=%.5lf,k=%.5lf\n"
Xs0,Ys0,Zs0,t,w,k);
\n外方位元素为:
fclose(fp);
程序运行的结果为:
五.实验总结:
通过这次的实验我学到了很多的东西,通过编程加深了对摄影测量空间后方交会相关知识的理解。
在老师的严格要求下,我翻阅了很多的C语言的书籍,看了很多的算法,这个程序最难的地方是矩阵的求逆,以及如何将文本文档中的数据赋给程序中的数组变量,这些在以前的学习中都没有学到,感谢刘昭华老师的严格要求。
感谢下载!
欢迎您的下载,资料仅供参考
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 空间 后方 交会 程序