📄 备份.cpp
字号:
#include<iostream.h>
#include<math.h>
#include<fstream.h>
class photo_mesure
{
public:
double **space;//存放相片上6个点的空间坐标(XYZ)
double **zuobiaoyi;//存放相片上6个点的坐标仪坐标(xy)
double **L;//L系数矩阵
double **XY,**xy;//存放中间变换矩阵 P151————7-3-2
photo_mesure()
{
space=new double* [6];
for(int i=0;i<6;i++)
space[i]=new double [3];
zuobiaoyi=new double* [6];
for( i=0;i<6;i++)
zuobiaoyi[i]=new double [2];
XY=new double* [11];
for( i=0;i<11;i++)
XY[i]=new double [11];
xy=new double* [11];
for( i=0;i<11;i++)
xy[i]=new double [1];
L=new double* [11];
for( i=0;i<11;i++)
L[i]=new double [1];
}
void getdata(double **space,double **zuobiaoyi,double **XY,double **xy)//确定起始坐标并求出中间变量矩阵
{
for(int i=0;i<=4;i++)// /////////////////////////前10行
{
for(int j=0;j<=2;j++)//1,2,3列
{
XY[2*i][j]=space[i][j];
XY[2*i+1][j]=0;
}
XY[2*i][3]=1;// 4列
XY[2*i+1][3]=0;
for(j=4;j<=6;j++)//5,6,7列
{
XY[2*i][j]=0;
XY[2*i+1][j]=space[i][j-4];
}
XY[2*i][7]=0;// 8列
XY[2*i+1][7]=1;
for(j=8;j<=10;j++)//9,10,11列
{
XY[2*i][j] =zuobiaoyi[i][0]*space[i][j-8];
XY[2*i+1][j]=zuobiaoyi[i][1]*space[i][j-8];
}
//以下确定xy[][]
xy[2*i][0] =zuobiaoyi[i][0];
xy[2*i+1][0]=zuobiaoyi[i][1];
}
//////////////////////////////// ////////////第11行
for(int j=0;j<=2;j++)
XY[10][j]=space[5][j];
XY[10][3]=1;
XY[10][4]=0;
XY[10][5]=0;
XY[10][6]=0;
XY[10][7]=0;
for(j=8;j<=10;j++)
XY[10][j]=zuobiaoyi[5][0]*space[5][j-8];
xy[10][0]=zuobiaoyi[5][0];
}
void time(double **e,double **f,double **g,int m,int n,int k)//矩阵乘积
{
int i,j;
for (i=0; i<=m-1; i++)
for (j=0; j<=k-1; j++)
{
g[i][j]=0;
for(int l=0;l<n;l++)
g[i][j]+=e[i][l]*f[l][j];
}
}
void zhuanzhi(double **w,double **ww,int m,int n)//矩阵转置
{
int i,j;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
ww[j][i]=w[i][j];
}
void qiuni(double **pp,double **mm,int ss)//求逆函数
{
double d,p;
int *is,*js,i,j,k,l,u;
is=new int[ss] ;
js=new int[ss] ;
for (k=0; k<=ss-1; k++)
{ d=0.0;
for (i=k; i<=ss-1; i++)
for (j=k; j<=ss-1; j++)
{ p=fabs(pp[i][j]);
if (p>d) { d=p; is[k]=i; js[k]=j;}
}//a[i][j] 最大,d=该最大值
if (d+1.0==1.0)
{ delete []is;
delete []js;
cout<<"该矩阵无法求逆:"<<endl;
}
if (is[k]!=k)
for (j=0; j<=ss-1; j++)
{
p=pp[k][j]; pp[k][j]=pp[is[k]][j]; pp[is[k]][j]=p;
}
if (js[k]!=k)
for (i=0; i<=ss-1; i++)
{
p=pp[i][k]; pp[i][k]=pp[i][js[k]]; pp[i][js[k]]=p;
}
l=k*ss+k;
pp[k][k]=1.0/pp[k][k];
for (j=0; j<=ss-1; j++)
if (j!=k)
{ u=k*ss+j; pp[k][j]=pp[k][j]*pp[k][k];}
for (i=0; i<=ss-1; i++)
if (i!=k)
for (j=0; j<=ss-1; j++)
if (j!=k)
{ u=i*ss+j;
pp[i][j]=pp[i][j]-pp[i][k]*pp[k][j];
}
for (i=0; i<=ss-1; i++)
if (i!=k)
{ pp[i][k]=-pp[i][k]*pp[k][k];}
}
for (k=ss-1; k>=0; k--)
{ if (js[k]!=k)
for (j=0; j<=ss-1; j++)
{
p=pp[k][j]; pp[k][j]=pp[js[k]][j]; pp[js[k]][j]=p;
}
if (is[k]!=k)
for (i=0; i<=ss-1; i++)
{
p=pp[i][k]; pp[i][k]=pp[i][is[k]]; pp[i][is[k]]=p;
}
}
for(i=0;i<ss;i++)
for(j=0;j<ss;j++)
mm[i][j]=pp[i][j];
}
void qiufu(double **mm,int m,int n)//矩阵的负数形式 -1
{
int i,j;
for(i=0;i<m;i++)
{for(j=0;j<n;j++)
mm[i][j]=-mm[i][j];
}
}
void plus(double **a,double **b,double **c,int m,int n)
{
int i,j;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
c[i][j]=a[i][j]+b[i][j];
}
void dive(double **a,double **b,double **c,int m,int n)
{
int i,j;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
c[i][j]=a[i][j]-b[i][j];
}
void display(double **mm,int m,int n)//输出矩阵
{
int i,j;
for(i=0;i<m;i++)
{for(j=0;j<n;j++)
cout<<mm[i][j]<<" ";
cout<<endl;
}
}
};
void main()
{
ifstream infile("space.txt",ios::in);
ifstream infile1("photo1.txt",ios::in);
ifstream infile2("photo2.txt",ios::in);
ofstream outfile("输出数据.txt",ios::out);
photo_mesure photo1,photo2,photo;
double kongjian[12][3],pingmian1[12][2],pingmian2[12][2];
int p1,p2,p3,p4,p5,p6;
for(int i=0;i<12;i++)
for(int j=0;j<3;j++)
infile>>kongjian[i][j];
for(i=0;i<12;i++)
for(int j=0;j<2;j++)
{
infile1>>pingmian1[i][j];
infile2>>pingmian2[i][j];
}
cout<<"请选择6个点作为控制点: "<<"1 2 3 4 5 6 7 9 10 12 13 14"<<endl;
cin>>p1>>p2>>p3>>p4>>p5>>p6;
outfile<<"您选择的6个控制点是 "<<p1<<" "<<p2<<" "<<p3<<" "<<p4<<" "<<p5<<" "<<p6<<" 号点"<<endl;
photo1.space[0][0]=kongjian[p1-1][0]; photo1.space[0][1]=kongjian[p1-1][1]; photo1.space[0][2]=kongjian[p1-1][2];
photo1.space[1][0]=kongjian[p2-1][0]; photo1.space[1][1]=kongjian[p2-1][1]; photo1.space[1][2]=kongjian[p2-1][2];
photo1.space[2][0]=kongjian[p3-1][0]; photo1.space[2][1]=kongjian[p3-1][1]; photo1.space[2][2]=kongjian[p3-1][2];
photo1.space[3][0]=kongjian[p4-1][0]; photo1.space[3][1]=kongjian[p4-1][1]; photo1.space[3][2]=kongjian[p4-1][2];
photo1.space[4][0]=kongjian[p5-1][0]; photo1.space[4][1]=kongjian[p5-1][1]; photo1.space[4][2]=kongjian[p5-1][2];
photo1.space[5][0]=kongjian[p6-1][0]; photo1.space[5][1]=kongjian[p6-1][1]; photo1.space[5][2]=kongjian[p6-1][2];
photo2.space[0][0]=kongjian[p1-1][0]; photo2.space[0][1]=kongjian[p1-1][1]; photo2.space[0][2]=kongjian[p1-1][2];
photo2.space[1][0]=kongjian[p2-1][0]; photo2.space[1][1]=kongjian[p2-1][1]; photo2.space[1][2]=kongjian[p2-1][2];
photo2.space[2][0]=kongjian[p3-1][0]; photo2.space[2][1]=kongjian[p3-1][1]; photo2.space[2][2]=kongjian[p3-1][2];
photo2.space[3][0]=kongjian[p4-1][0]; photo2.space[3][1]=kongjian[p4-1][1]; photo2.space[3][2]=kongjian[p4-1][2];
photo2.space[4][0]=kongjian[p5-1][0]; photo2.space[4][1]=kongjian[p5-1][1]; photo2.space[4][2]=kongjian[p5-1][2];
photo2.space[5][0]=kongjian[p6-1][0]; photo2.space[5][1]=kongjian[p6-1][1]; photo2.space[5][2]=kongjian[p6-1][2];
photo1.zuobiaoyi[0][0]=pingmian1[p1-1][0]; photo1.zuobiaoyi[0][1]=pingmian1[p1-1][1];
photo1.zuobiaoyi[1][0]=pingmian1[p2-1][0]; photo1.zuobiaoyi[1][1]=pingmian1[p2-1][1];
photo1.zuobiaoyi[2][0]=pingmian1[p3-1][0]; photo1.zuobiaoyi[2][1]=pingmian1[p3-1][1];
photo1.zuobiaoyi[3][0]=pingmian1[p4-1][0]; photo1.zuobiaoyi[3][1]=pingmian1[p4-1][1];
photo1.zuobiaoyi[4][0]=pingmian1[p5-1][0]; photo1.zuobiaoyi[4][1]=pingmian1[p5-1][1];
photo1.zuobiaoyi[5][0]=pingmian1[p6-1][0]; photo1.zuobiaoyi[5][1]=pingmian1[p6-1][1];
photo2.zuobiaoyi[0][0]=pingmian2[p1-1][0]; photo2.zuobiaoyi[0][1]=pingmian2[p1-1][1];
photo2.zuobiaoyi[1][0]=pingmian2[p2-1][0]; photo2.zuobiaoyi[1][1]=pingmian2[p2-1][1];
photo2.zuobiaoyi[2][0]=pingmian2[p3-1][0]; photo2.zuobiaoyi[2][1]=pingmian2[p3-1][1];
photo2.zuobiaoyi[3][0]=pingmian2[p4-1][0]; photo2.zuobiaoyi[3][1]=pingmian2[p4-1][1];
photo2.zuobiaoyi[4][0]=pingmian2[p5-1][0]; photo2.zuobiaoyi[4][1]=pingmian2[p5-1][1];
photo2.zuobiaoyi[5][0]=pingmian2[p6-1][0]; photo2.zuobiaoyi[5][1]=pingmian2[p6-1][1];
//////////////////////////// 1 //////////////////////////
photo1.getdata(photo1.space,photo1.zuobiaoyi,photo1.XY,photo1.xy);//通过space和zuobiaoyi坐标,计算XY,xy。
photo1.qiuni(photo1.XY,photo1.XY,11);
photo1.time(photo1.XY,photo1.xy,photo1.L,11,11,1);
photo1.qiufu(photo1.L,11,1);//////////////////////////解算出photo1的L[11]矩阵
cout<<"L1初始值"<<endl;
photo1.display(photo1.L,11,1);///////////////////////////////测试
cout<<"*********************************"<<endl;
photo2.getdata(photo2.space,photo2.zuobiaoyi,photo2.XY,photo2.xy);
photo2.qiuni(photo2.XY,photo2.XY,11);
photo2.time(photo2.XY,photo2.xy,photo2.L,11,11,1);
photo2.qiufu(photo2.L,11,1);//////////////////////////解算出photo2的L[11]矩阵
cout<<"L2初始值"<<endl;
photo2.display(photo2.L,11,1);///////////////////////////////测试
cout<<"*********************************"<<endl;
/////////////////////////// 2 //////////////////////////////// 见课本151页
double **coordinate_space;//存放物方空间坐标近似值 3*1
double **coordinate_zuobiaoyi;//存放坐标仪坐标 2*2
double **LXY,**lxy;//存放中间变量矩阵3*3, 3*1
coordinate_space=new double* [3];
for( i=0;i<3;i++)
coordinate_space[i]=new double [1];
coordinate_zuobiaoyi=new double* [2];
for(i=0;i<2;i++)
coordinate_zuobiaoyi[i]=new double [2];
LXY=new double* [3];
for( i=0;i<3;i++)
LXY[i]=new double [3];
lxy=new double* [3];
for( i=0;i<3;i++)
lxy[i]=new double [1];
for(int k=0;k<12;k++)///////////////////////////////////////////////大循环,计算每个点
{
outfile<<"第 "<<k+1<<" 点 "<<endl;
outfile<<" 原始坐标是:"<<endl;
outfile<<" "<<kongjian[k][0]<<" "<<kongjian[k][1]<<" "<<kongjian[k][2]<<endl;
coordinate_zuobiaoyi[0][0]=pingmian1[k][0];//输入相片上某点的坐标仪坐标,用来进而确定其对应的物方空间坐标的近似值
coordinate_zuobiaoyi[0][1]=pingmian1[k][1];
coordinate_zuobiaoyi[1][0]=pingmian2[k][0];
coordinate_zuobiaoyi[1][1]=pingmian2[k][1];
for(i=0;i<2;i++) //确定中间变量矩阵
{
lxy[i][0]=photo1.L[4*i+3][0]+coordinate_zuobiaoyi[0][i];
for(int j=0;j<=2;j++)
LXY[i][j]=photo1.L[4*i+j][0]+coordinate_zuobiaoyi[0][i]*photo1.L[8+j][0];
}
for(int j=0;j<3;j++)
LXY[2][j]=photo2.L[j][0]+coordinate_zuobiaoyi[1][0]*photo2.L[j+8][0];
lxy[2][0]=photo2.L[3][0]+coordinate_zuobiaoyi[1][0];
photo.qiuni(LXY,LXY,3);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -