C语言空间后方交会源代码Word格式.docx
《C语言空间后方交会源代码Word格式.docx》由会员分享,可在线阅读,更多相关《C语言空间后方交会源代码Word格式.docx(14页珍藏版)》请在冰豆网上搜索。
i<
6;
i++)//构造高斯矩阵
//for(j=0;
j<
j++)
//q[i][j]=c[i][j];
//for(i=0;
i++)
//for(j=6;
12;
//{
//if(i+6==j)
//q[i][j]=1;
//else
//q[i][j]=0;
//}
//for(h=k=0;
k<
n-1;
k++,h++)//消去对角线以下的数据
//for(i=k+1;
//{
//if(q[i][h]==0)
//continue;
//p=q[k][h]/q[i][h];
////p=q[i][h]/q[k][h];
//for(j=0;
//{
//q[i][j]*=p;
//q[i][j]-=q[k][j];
//}
//}
//for(h=k=5;
k>
0;
k--,h--)//消去对角线以上的数据
//for(i=k-1;
i>
=0;
i--)
//{
//if(q[i][h]==0)
//continue;
//p=q[k][h]/q[i][h];
////p=q[i][h]/q[k][h];
//for(j=11;
j>
j--)
//{
//q[i][j]*=p;
//q[i][j]-=q[k][j];
//}
//for(i=0;
i++)//将对角线上数据化为1
//p=1.0/q[i][i];
//for(j=0;
i++)//提取逆矩阵
n;
//c[i][j]=q[i][j+6];
//}
voidContraryMatrix(double*constpMatrix,double*const_pMatrix,constint&
dim)
intii,jj,kk;
intflag=0;
double*tMatrix=newdouble[2*dim*dim];
for(inti=0;
i<
dim;
i++){
for(intj=0;
j<
j++)
tMatrix[i*dim*2+j]=pMatrix[i*dim+j];
}
for(i=0;
for(intj=dim;
dim*2;
tMatrix[i*dim*2+j]=0.0;
tMatrix[i*dim*2+dim+i]=1.0;
//Initializationover!
i++)//ProcessCols
{
doublebase=tMatrix[i*dim*2+i];
if(fabs(base)<
1E-300)
{
for(ii=i;
ii<
ii++)
{
if(tMatrix[ii*dim*2+i]!
=0)
{
flag=1;
for(jj=0;
jj<
2*dim;
jj++)
{
tMatrix[i*dim*2+jj]+=tMatrix[ii*dim*2+jj];
}
}
}
base=tMatrix[i*dim*2+i];
if(flag==0)
printf("
求逆矩阵过程中被零除,无法求解!
"
);
//exit(0);
}
j++)//row
if(j==i)continue;
doubletimes=tMatrix[j*dim*2+i]/base;
for(intk=0;
k<
k++)//col
{
tMatrix[j*dim*2+k]=tMatrix[j*dim*2+k]-times*tMatrix[i*dim*2+k];
}
for(intk=0;
k++){
tMatrix[i*dim*2+k]/=base;
i++)
_pMatrix[i*dim+j]=tMatrix[i*dim*2+j+dim];
}
delete[]tMatrix;
}
voidmain()
{
doublef,xo,yo;
//方位元素
intm;
//摄影比例尺分母
f=0.15324;
xo=0;
yo=0;
m=50000;
structcoordinatecoor[n]={{-0.08615,-0.06899,36589.41,25273.32,2195.17},{-0.05340,0.08221,37631.08,31324.51,728.69},{-0.01478,-0.07663,39100.97,24934.98,2386.50},
{0.01046,0.06443,40426.54,30319.81,757.31}};
inti,j;
//循环变量
doubleXs,Ys,Zs;
//外方位线元素
doublephi,omega,kappa;
//外方位角元素
doubleR[3][3];
//旋转矩阵R
double(x)[n],(y)[n];
//控制点像点坐标的近似值
doubleA[8][6];
//误差方程中的矩阵A
doubleATA[6][6];
//矩阵A的转置矩阵与A的乘积
doubleL[8][1];
doubleATL[6][1];
//矩阵A的转置矩阵与L的乘积
double_ATA[6][6];
doubleX[6][1];
//未知数矩阵
doubleV[8][1];
//改正数矩阵
doubleDXs,DYs,DZs,Dphi,Domega,Dkappa;
//6个外方位元素的改正值
//与精度计算有关的量
doublem0;
//单位权中误差
doubleQ[6][6];
//协方差矩阵
doublem1,m2,m3,m4,m5,m6;
//未知数Xs,Ys,Zs,phi,omega,kappa的中误差矩阵
Xs=0;
Ys=0;
for(i=0;
Xs+=coor[i].Xt;
Ys+=coor[i].Yt;
//外方位元素的初始值
Xs/=n;
Ys/=n;
Zs=f*m;
phi=0;
omega=0;
kappa=0;
//在竖直摄影情况下
do
//计算旋转矩阵R的各个元素
R[0][0]=cos(phi)*cos(kappa)-sin(phi)*sin(omega)*sin(kappa);
R[0][1]=-cos(phi)*sin(kappa)-sin(phi)*sin(omega)*cos(kappa);
R[0][2]=-sin(phi)*cos(omega);
R[1][0]=cos(omega)*sin(kappa);
R[1][1]=cos(omega)*cos(kappa);
R[1][2]=-sin(omega);
R[2][0]=sin(phi)*cos(kappa)+cos(phi)*sin(omega)*sin(kappa);
R[2][1]=-sin(phi)*sin(kappa)+cos(phi)*sin(omega)*cos(kappa);
R[2][2]=cos(phi)*cos(omega);
//将未知数的近似值代人共线方程式,计算(x),(y)
for(i=0;
(x)[i]=-f*(R[0][0]*(coor[i].Xt-Xs)+R[1][0]*(coor[i].Yt-Ys)+R[2][0]*(coor[i].Zt-Zs))/(R[0][2]*(coor[i].Xt-Xs)+R[1][2]*(coor[i].Yt-Ys)+R[2][2]*(coor[i].Zt-Zs));
(y)[i]=-f*(R[0][1]*(coor[i].Xt-Xs)+R[1][1]*(coor[i].Yt-Ys)+R[2][1]*(coor[i].Zt-Zs))/(R[0][2]*(coor[i].Xt-Xs)+R[1][2]*(coor[i].Yt-Ys)+R[2][2]*(coor[i].Zt-Zs));
//计算矩阵A的各个元素
A[2*i][0]=(R[0][0]*f+R[0][2]*(coor[i].x-xo))/(R[0][2]*(coor[i].Xt-Xs)+R[1][2]*(coor[i].Yt-Ys)+R[2][2]*(coor[i].Zt-Zs));
A[2*i][1]=(R[1][0]*f+R[1][2]*(coor[i].x-xo))/(R[0][2]*(coor[i].Xt-Xs)+R[1][2]*(coor[i].Yt-Ys)+R[2][2]*(coor[i].Zt-Zs));
A[2*i][2]=(R[2][0]*f+R[2][2]*(coor[i].x-xo))/(R[0][2]*(coor[i].Xt-Xs)+R[1][2]*(coor[i].Yt-Ys)+R[2][2]*(coor[i].Zt-Zs));
A[2*i][3]=(coor[i].y-yo)*sin(