版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
摄影测量前方交会程序(C/C++)
输入数据截图:
结果截图:
程序源代码(其中的矩阵求逆在前面己经有了,链接):
Sinclude<stdio.h>
^include<stdlib.h>
^include<math.h>
constdoublePRECISION=le-5;
typedefdoubleDOUBLE[5];
intInputData(int&Num,DOUBLE*&Data,double&m,double&f);
intResection(constint&Num,constDOUBLE*&Data,constdouble&m,constdouble&f);
intInverseMatrix(double*matrix,constint&row);
intmain(intargc,char*argv[])
(
DOUBLE*Data=NULL;
intNum;
doublef(0),m(0);
if(InputData(Num,Data,m,f))
(
if(Data!=NULL)
(
delete[]Data;
)
return1;
)
if(Resection(Num,Data,m,f))
(
if(Data!=NULL)
(
delete[jData;
}
return1;
)
if(Data!=NULL)
{
delete[]Data;
)
printf("解算完毕...\n");
do{
printf(〃计算结果保存于\〃结果.txt\〃文件中\n"
〃请选择操作(输入P翻开结果数据,R翻开原始数据,其它退出程序):〃);
fflush(stdin);〃刷新输入流
charorder=getchar();
if('P,=order||*p*==order)
(
system(〃结果.txt");
)
elseif('R'==order||*r*==order)
(
system(z,data.txt");
)
else
break;
system(〃cls〃);
}while(l);
system("PAUSE");
return0;
)
/5^C^|C
*函数名:InputData
*函数介绍:从文件(data,txt)中读取数据,
*文件格式如下:
*点数m(未知写作0)
*内方位元素(fxOyO)
*编号xyXYZ
*下面是一个实例:
40
153.2400
1-86.15-68.9936589.4125273.322195.17
2-53.4082.2137631.0831324.51728.69
3-14.78-76.6339100.9724934.982386.50
410.4664.4340426.5430319.81757.31
*参数:(in/out)Num(点数),
*(in/out)Data(存放数据),m,f,xO,yO
*返回值:int,0成功,1文件翻开失败,2控制点个
*数缺乏,3文件格式错误
*vers
*完成时间:09-10-4
.Z、],、],—I,、]■^r*、[,、1,/
intlnputData(int&Num,DOUBLE*&Data,double&m,double&f)
doublexO,yO;
FILE*fp_input;
if(!(fp_input=fopen("data.txt〃,〃r〃)))
(
return1;
}
fscanf(fp_input,〃%d%lf〃,&Num,&m);
if(Num<4)
{
return2;
}
fscanf(fpinput,&f,&x0,&y0);
f/=1000;
if(m<0||f<0)
(
return3;
}
Data=newDOUBLE[Num];
double*temp=newdouble[Num-11;
doublescale=0;
inti;
for(i=0;i<Num;i++)
(
〃读取数据,忽略编号
if(fscanf(fp_input,
&Data[i][oj,&Data[i][l],&Data[i][2],
&Data[i][3],&Data[i][4])!=5)
(
return3;
}
〃单位换算成m
Data[i][0]/=1000.0;
Data[i][l]/=1000.0;
)
〃如果m未知那么归算其值
if(0==m)
(
for(i=0;i<Num-l;i++)
(
temp[i]=(Data[i][2]-Data[i+l][2])/(Data[i][0]-Data[i+l][0])+
(Dala[i][3]-Data[i+l][3])/(Da.la[i][l]_Dalci[i+l][1]);
scale+=temp[i]/2.D;
}
m=scale/(Num-1);
}
fclose(fpinput);
delete[]temp;
return0;
)
;W*q.%lx、>
,*T*^7**(*^J**^»^7*
*函数名:MatrixMul
*函数介绍:求两个矩阵的积,
*参数:Jzl(第一个矩阵),row(第一个矩阵行数),
*Jz2(第二个矩阵),row(第二个矩阵列数),com(第一个
*矩阵列数),(out)jgjz(存放结果矩阵)
*返回值:void
*vers
*完成时间:09-10-4
>jcx<>|<>}c>:<x<J{C>]c>卜x<x<>|<)}c>jcx<x《>k>k>:<x<^{<>卜>jcx<x<>jc>jc>:<x<^{c)卜>卜x<x<>|c>}c>:<x<x<>k>jcx<x<)卜/
voidMatrixMul(double*Jzl,constint&row,double*Jz2,
constint&line,constint&com,double*JgJz)
(
for(inti=0;i<row;i++)
(
for(intj=0;j<line;j++)
{
doubletemp=0;
for(intk=0;k<com;k++)
(
temp+=*(Jzl+i*com+k)*(*(Jz2+k*1ine+j));
}
*(JgJz+i*line+j)=temp;
)
}
)
/«/>
*T**T**7**(**T^*T**T*^7^*1**T**T**T**T**T**T**T**T**T**T**T**T**7**T^*T**T**1**T**7*
*函数名:OutPut
*函数介绍:向结果.txt文件输出数据
*参数:Q协因数阵,m精度,制单位权中误差,6个外
*方位元素,旋转矩阵
*返回值:int,0成功,1失败
*vers
*完成时间:09-10-4
«y»ri*rT**J*»T**T*»Y»riw*T*rj*ri**J**y»ri*ri*rjw*1*»T*ri*rj*»Y**T*rj**1**J**y»ri**T»,,
intOutPut(constdouble*&Q,constdouble*&m,constdouble&m0,
constdouble&Xs,constdouble&Ys,constdouble&Zs,
constdouble&Phi?constdouble&0mega,
constdouble&Kappa,constdouble*R)
(
FILE*fp_out;
if(!(fp_out=fopen(〃结果.txt〃,〃w〃)))
(
return1;
}
FILE*fp_input;
if(!(fp_input=fopen(z/data.txl",〃r〃)))
(一
return1;
}
fprintf(fpout,〃**************************************〃
〃"
*T**r**r**i**r*^T»
X<J{C>]c>卜x<x<^jc>jc>:«x<x<>|c>|c>:<x<^{<}jc>jcx<X<>jc>:<x<^{c)卜>卜x<x《>jc>}c>:<x<x<>卜>jcx<x<
〃^|c^|c〃)•
fprintf(fp_out,"\n空间前方交会程序(C\\C++)\n遥感信息工程学院\n班级:
〃00000\n学号:0000000\n姓名:vcrs\n\n〃);
fprintf(fpout,”**************************************"
*T**T»*T**T*^r**?*'
*^C^Jc5^C*^C5^C»^C*^Cr^CJ^C5|C5^C*^C*^C5^C5jw*^C
*T**7**T**T**T**T**1**T**T**T*\\I1、•
fprin贯(fp_uut,〃数据:\u\u点数:〃);
intnum;doubletemp,x,y;
fscanf(fpinput,/z%d%lf/z,&num,&temp);
fprintf(fp_out,,,%d\n,/,num);
fprintf(fp_out,〃摄影比例尺(。表示其值位置):〃);
fprintf(fp_out,z,%10.01f\n”,temp);
fprintf(fp_out,〃内方位元素(fxOyO):〃);
fscanf(fpinput,,,%lf%lf%lf/,,&temp,&x,&y);
fprintf(fp_out,/z%101f\t%101f\t%101f\nz,,temp,x,y);
for(inti=0;i<num;i++)
(
doubletemp[5];
fscanf(fp.input,〃%*酰1f%lf%lf%lf%lf〃,
&temp[0],&temp[l],&temp[2],&temp[3],&temp[4]);
,,,,
fprintf(fp_out,%3d\t%101f\t%101f\t%10lf\t%101f\t%101f\n)
i+1,teiup[0],leuiptl],temp[2],leiup[3],leiup[4]);
fclose(fpinput);
fprintf(fpout,〃**************************************
•Jx^r*^T»^«rL*«^r*''
^CX^Z^C^C%^Z>^Z*^XX^Z[[)•
fprintf(fpout,“计算结果如下:\n\n外方位元素:\n〃);
fprintf(fpout.,,/\t.Xs=%101f\n/z,Xs);
fprintf(fp_out,/z\tYs=%10lf\nz,,Ys);
fprintf(fp_out,/z\tZs=%101f\n/z,Zs);
fprintf(fp_out,//\tPhi=%101f\n,z,Phi);
fprintf(fpout,”\tOmega二$101f\n〃,Omega);
fprintf(fp_out,〃\tKappa二$101f\n\n”,Kappa);
fprintf(fp_out,"旋转矩阵:\n〃);
for(i=0;i<3;i++)
(
fprintf(fp_out,〃\t〃);
for(intj=0;j<3;j++)
{
fprintf(fp_out,z,%101f\tzz,*(R+i*3+j));
)
fprintf(fp_out,//\n,/);
)
fprintf(fpout,〃\n单位权中误差:%101f\n\n,,»mO);
fprintf(fp_out,〃协因数阵:\n〃);
for(i=0;i<6;i++)
(
fprintf(fp_out,,,\tz,);
for(intj=0;j<6;j++)
(
fprintf(fp_out,〃%2Olf\t〃,*(Q+i*6+j));
)
fprintf(fp_out,〃\n〃);
)
fprintf(fp_out,〃\n外方位元素精度:”);
for(i=0;i<6;i++)
(
fprintf(fp_out,,,%10Lf\t/,,m[i]);
}
fprintf(fpout,〃\n〃);
fprintf(fp_cut,〃**************************************"
«X*
*T**T**1^*T**T**T^*7**T^*T**7**T**T**T**j**?**T^*T**T**T**j**T*
5^C^|c^|c5jc5^C^|c^|c5^C5|C^|C^|C^|C5|C5|c^|C!^C5|c5|C5|C^C5^C5|C5|C5jC5^C5|c5|C5|C^|C5|C^|C5^C5^C
*1^«>l««X»\、•
*T**«**r**T^*T*\II
fclose(fp_out);
return0;
}
;*1*<U«J*«!««1«*1**1*«1«*1*»1**1**1**1**1«<U«J**1*
•»^•»*
*函数名:Resection
*函数介绍:计算
*参数:Num(点数),Data(数据),m,,f(焦距),x0,y0
*返回值:int,0成功,其它失败
*vers
*完成时间:09-10-4
^P*2^*J**1**J**1**J*»j*^1**2^*J»*j**J**|«*J**J*/
intResection(constint&Num,constDOUBLE*&Data,constdouble&m,
constdouble&f)
doubleXs=0,Ys=0,Zs=0;
inti,j;
〃设置初始值
for(i=0;i<Num;i++)
(
Xs+=Data[i][2];
Ys+=Data[i][3];
}
Xs/=Num;
Ys/=Num;
Zs=m*f;
doublePhi(0),Omega(0),Kappa(0);
doubleR[3][3]={0.0}:
double*L=nowdouble[2*Num];
typedefdoubleDouble6[6];
Double6*A=newDouble6[2*Num];
double*AT=newdouble[2*Num*6];
double*ATA=newdouble[6*6];
double*ATL=newdouble[6];
double*Xg=newdouble[6];
〃迭代计算
do
〃旋转矩阵
R[0][O]=cos(Phi)*cos(Kappa)-sin(Phi)*sin(Omega)*sin(Kappa);
R[O][l]=-cos(Phi)*sin(Kappa)-sin(Phi)*sin(Omega)*cos(Kappa);
R[O][2]=-sin(Phi)*cos(Omega);
R[l][O]=cos(Omega)*sin(Kappa);
R[l][1]=cos(Omega)*cos(Kappa);
R[l][2]=-sin(Omega);
R[2][0]=sin(Phi)*cos(Kappa)+cos(Phi)*sin(Omega)*sin(Kappa);
R[2][l]=-sin(Phi)*sin(Kappa)+cos(Phi)*sin(Omega)*cos(Kappa);
R[2][2]=cos(Phi)*cos(Omega);
for(i=O;i<Num;i++)
(
doubleX=R[O][0]*(Data[i][2]-Xs)4-R[l][0]*(Data[i][3]-Ys)+
R[2][0]*(Data[i][4]-Zs);
doubleY=R[O][l]*(Data[i][2]-Xs)+R[l][l]*(Data[i][3]-Ys)+
R[2][l]*(Data[i][4]-Zs);
doubleZ=R[O][2]*(Data[i][2]Xs)iR[l][2]*(Data[i][3]Ys)।
R[2][2]*(Data[i][4]-Zs);
doublexxx,yyy;
xxx=-f*X/Z;
yyy=-f*Y/Z;
〃常数项
L[2*i]=Data[i][O]-(-f*X/Z);
L[2*i+l]=Data[i][l]-(-f*Y/Z);
A[2*i][0]=(R[0][O]*f+R[O][2]*(xxx))/Z;
A[2*i][l]=(R[l][0]*f+R[l][2]*(xxx))/Z;
A[2*i][2]=(R[2][0]*f+R[2][2]*(xxx))/Z;
A[2*i][3]=(yyy)*sin(Omega)-(((xxx)/f)*
((xxx)*cos(Kappa)-(yyy)*sin(Kappa))+
f*cos(Kappa))*cos(Omega);
A[2*i][4]=-f*sin(Kappa)-((xxx)/f)*((xxx)*
sin(Kappa)+(yyy)*cos(Kappa));
A[2*i][5]=(yyy);
A[2*i+l][0]=(R[0][1]*f+R[0][2]*(yyy))/Z;
A[2*i4-l][l]=(R[l][l]*f+R[l][2]*(yyy))/Z;
A[2*i+1][2]=(R[2][l]*f+R[2][2]*(yyy))/Z;
A[2*i+l][3]=-(xxx)*sin(Omega)-(((yyy)/f)*
((xxx)*cos(Kappa)-(yyy)*sin(Kappa))一
f*sin(Kappa))*cos(Omega);
A[2*i+l][4]=-f*cos(Kappa)-((yyy)/f)*((xxx)*
sin(Kappa)+(yyy)*cos(Kappa));
A[2*i+l][5]=-(xxx):
〃求矩阵A的转置矩阵AT
for(i=0;i<2*Num;i++)
(
for(j=0;j<6;j++)
(
*(AT+j*2*Num+i)=A[i][j];
)
)
〃求ATA
MatrixMul(AT,6,&A[0][0],6,2*Num,ATA);
if(InverseMatrix(ATA,6))
return1;
MatrixMul(AT,6,L,1,2*Num,ATL);
MatrixMul(ATA,6,ATL,1,6,Xg);
Xs+=Xg[0];
Ys+=Xg[l];
Zs+=Xg[2];
Phi+=Xg[3];
0mega+=Xg[4];
Kappa+=Xg[5];
}while(fabs(Xg[0])^PRECISION||fabs(Xg[l])"PRECISION||
fabs(Xg[2])>=PRECIS1ON||fabs(Xg[3])>=PRECISION||
fabs(Xg[4])>=PRECISION||(Xg[5])>=PRECISION);
〃注:协因数阵,旋转矩阵等计算本应该使用最后外方位元素值,
〃由于变换很小忽略
double*Q=ATA;
double*V=newdouble[2*Num];
MatrixMul(&A[0][0],2*Num,Xg,1,6,V);
doubleVTV=0;
for(i=0;i<2*Num;i।।)
(
V[i]-=L[i];
VTV+=V[i]*V[i];
}
doublen)0=sqrt(VTV/(2*Num-6));
double*mm=newdouble[6];
fui-(i=0;i<6;i++)
mm[i]=sqrt(*(Q+i*6+i))*mO;
}
OutPut(Q,mm,mO,Xs,Ys,Zs,Phi,Omega,Kappa,&R[O][0]);
delete[]L;
delete[]A;
delete[]AT;
delete[]ATA;
delete[]ATL;
delete[]Xg;
delete[]mm;
delete[]V;
return0;
)
voidswap(double&a,double&b)
(
doubletemp=a;
a=b;
b=temp;
}
;*1**1**1*
•»*•»*
*函数名:InverseMatrix
*函数介绍:求矩阵的逆(高斯-约当法)
*输入参数:(in/out)matrix(矩阵首地址),
*(in)row(矩阵阶数)
卡输出参数:matrix(原矩阵的逆矩阵)
*返回值:int,0成功,1失败
*调用函数:swap(double&,doubled)
*vcrs
*完成时间:09-10-4
X1Z«£*•]»*1*xl*
,「*Y**Y*,卜^7**,**Y**Y*f*J**Y*,卜。、4、*T**Y*f*Y**T»,&、f*?**Y**T*,&、*T**T»,卜*Y**T*,,、*T**T**Y*,卜
intInverseMatrix(double*matrix,constint&row)
double*m=newdouble[row*row];
double*ptemp,*pt=m;
inti,j;
ptemp=matrix;
for(i=0;i<row;i++)
(
for(j=0;j<row;j++)
(
*pl=+plciiip;
ptemp++;
pt++:
}
intk;
int*is=newint[row],*js=newint[row];
for(k=0;k<row;k++)
(
doublemax=0;
〃全选主元
〃寻找最大元素
for(i=k;i<row;i++)
(
for(j=k;j<row;J+4-)
(
if(fabs(*(m+i*row+j))>max)
(
max=*(m+i*row+j);
is[k]=i;
js[k]=j;
)
)
)
if(0=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 人教版英语三年级下册新教材课件Unit 1
- 应收账款回收责任制度
- 员工申诉管理办法
- 2026电视台面试题库及答案
- 机器人立体定向放射外科系统治疗胰腺癌中国专家共识(2026版)
- 工业机器人维护合同(2026年制造业服务)
- 零跑D19大定 提车用户调研报告 电动汽车用户联盟出品
- 跳伞应急迫降区域选择与处置手册
- C 语言异常处理与程序健壮性手册
- 托儿所档案管理与信息保密手册
- 2026初中地理会考必考4张图
- 空调维保应急预案
- 房屋建筑工程竣工验收技术资料统一用表(2025版)
- 2025 六年级地理上册东南亚地区的海上交通要道课件
- 2026年内蒙古聚英人力资源服务有限责任公司定向招聘劳务派遣人员的备考题库附答案详解
- 高校辅导员招聘笔试题目与答案解析含专业能力测试
- 人体胚胎学总论完整教案
- 运动损伤的预防、治疗与恢复
- 爆破三员考试试题在线及答案大全
- 宠物智能陪伴机器人创新创业项目商业计划书
- (正式版)DB21∕T 4180-2025 《综合法人库数据元规范》
评论
0/150
提交评论