后方交会程序实现(c语言版)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include

#include

#include

#include

#include

#define N 4

#define T 1.41421

void turn(double *A,double A2[],int m,int n) //计算矩阵的转置

{ int i,j;

for(i=0;i

for(j=0;j

A2[j*m+i]=A[i*n+j];

}

void mulAB(double *A,double *B,double *C,int am,int an,int bm,int bn) //计算两矩阵相乘

{

int i,j,l,u;

if(an!=bm)

{

printf("error!cannot do the multiplication.\n");

return;

}

for(i=0;i

for(j=0;j

{

u=i*bn+j;

C[u]=0.0;

for(l=0;l

C[u]+=A[i*an+l]*B[l*bn+j];

}

return;

}

double *inv(double *a,int n) //计算矩阵的逆,本程序的难点,采用高斯约旦全选主元法{

int *is,*js,i,j,k,l,u,v;

double d,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;i

for (j=k;j

{ 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);

printf("error not inv\n");

return NULL;

}

if (is[k]!=k)

for (j=0;j

v=is[k]*n+j;

p=a[u];

a[u]=a[v];

a[v]=p;

}

if (js[k]!=k)

for (i=0;i

v=i*n+js[k];

p=a[u];

a[u]=a[v];

a[v]=p;

}

l=k*n+k;

a[l]=1.0/a[l];

for (j=0;j

if (j!=k)

{

u=k*n+j;

a[u]=a[u]*a[l];

}

for (i=0;i

if (i!=k)

for (j=0;j

if (j!=k)

{ u=i*n+j;

a[u]=a[u]-a[i*n+k]*a[k*n+j];

}

for (i=0;i

if (i!=k)

{ u=i*n+k;

a[u]=-a[u]*a[l];

}

}

for (k=n-1;k>=0;k--)

{ if (js[k]!=k)

for (j=0;j<=n-1;j++)

{ u=k*n+j;

v=js[k]*n+j;

p=a[u];

a[u]=a[v];

a[v]=p;

}

if (is[k]!=k)

for (i=0;i

{ u=i*n+k;

v=i*n+is[k];

p=a[u];

a[u]=a[v];

a[v]=p;

}

}

free(is);

free(js);

return a;

}

main()//主函数,空间后方交会的计算{

FILE *fp; //定义一个文件指针

long m;

int i,j=0,it;

double G[1000];

double

f,t,w,k,limit=0,S1=0.0,S2=0.0,S3=0.0,x[N]={0},y[N]={0},x0[N]={0},y0[N]={0},X[N]={0},Y[N] ={0},Z[N]={0},Xs0,Ys0,Zs0;

double

a[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]={0};

double F[6],Qx[6][6],Mi[6][6];

if((fp=fopen("e:\\shuju.txt","r"))==NULL) //使fp指向被打开的shuju.txt 文件

{ //并判断文件是否打开成功

printf("\nerror on open shuju.txt\n");

getch();

exit(1);

}

for(i=0;i

fscanf(fp,"%lf%lf%lf%lf%lf",&x[i],&y[i],&X[i],&Y[i],&Z[i]); //将文件中的数据赋给主函数定义的变量

printf("原始数据:\n");

printf("x\t\ty\t\tX\t\tY\t\tZ\t\t\n");//输出文件中的原始数据

for(i=0;i

printf("%.3lf\t\t%.3lf\t\t%.3lf\t%.3lf\t%.3lf\n",x[i],y[i],X[i],Y[i],Z[i]);

printf("\n请输入摄影机主距和摄影比例尺分母;f,m:");

scanf("%lf%ld",&f,&m); //输入f,m

f=f/1000.0;

for(i=0;i

{ 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; //计算外方位元素的初始值

相关文档
最新文档