⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 备份.cpp

📁 通过使用两张以上照片以及 至少六个控制点的物方坐标和像点坐标
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	photo.time(LXY,lxy,coordinate_space,3,3,1);
	photo.qiufu(coordinate_space,3,1);
//	outfile<<"          近似坐标是:"<<endl;
	photo.display(coordinate_space,3,1);//输出物方空间坐标的近似值
//	outfile<<coordinate_space[0][0]<<"  "<<coordinate_space[1][0]<<"  "<<coordinate_space[2][0]<<endl;
	cout<<"*********************************"<<endl;

//////////////////////////////    3     ////////////////////////////////////////
	double **M,**L,**W,**r,**A,**L1,**L2,**V;
	double **ML;
	double photo1_x0,photo1_y0,photo2_x0,photo2_y0,x0,y0,photo1_k1,photo2_k1;
	double _A,_B,_C,old_fx,new_fx;
	M=new double* [12];		
			for( i=0;i<12;i++)
				M[i]=new double [12];
	L=new double* [12];		
			for( i=0;i<12;i++)
				L[i]=new double [1];
	L1=new double* [11];		
			for( i=0;i<11;i++)
				L1[i]=new double [1];
	L2=new double* [11];		
			for( i=0;i<11;i++)
				L2[i]=new double [1];
	W=new double* [12];		
			for( i=0;i<12;i++)
				W[i]=new double [1];
	r=new double* [6];		
			for( i=0;i<6;i++)
				r[i]=new double [1];
	A=new double* [6];		
			for( i=0;i<6;i++)
				A[i]=new double [1];
	ML=new double* [12];		
			for( i=0;i<12;i++)
				ML[i]=new double [1];
	V=new double* [12];		
			for( i=0;i<12;i++)
				V[i]=new double [1];

			 
int ii=0;
new_fx=10000;//任取初始值以便循环
x0=-1*(photo1.L[0][0]*photo1.L[8][0]+photo1.L[1][0]*photo1.L[9][0]+photo1.L[2][0]*photo1.L[10][0])/(pow(photo1.L[8][0],2)+pow(photo1.L[9][0],2)+pow(photo1.L[10][0],2));
y0=-1*(photo1.L[4][0]*photo1.L[8][0]+photo1.L[5][0]*photo1.L[9][0]+photo1.L[6][0]*photo1.L[10][0])/(pow(photo1.L[8][0],2)+pow(photo1.L[9][0],2)+pow(photo1.L[10][0],2));
//cout<<x0<<" "<<y0<<endl;	
	do
	{
		ii++;
		old_fx=new_fx;     // cout<<old_fx<<endl;
		for(i=0;i<=5;i++)
			A[i][0]=photo1.L[8][0]*photo1.space[i][0]+photo1.L[9][0]*photo1.space[i][1]+photo1.L[10][0]*photo1.space[i][2]+1;
//		cout<<"A"<<A[0][0]<<endl;  //测试
		for(i=0;i<=5;i++)
			r[i][0]=sqrt( pow((photo1.zuobiaoyi[i][0]-x0),2) + pow((photo1.zuobiaoyi[i][1]-y0),2));
		for(i=0;i<=5;i++)                                                                           // 确定M
		{
			for(int j=0;j<=2;j++) //1 2 3列
			{
				M[2*i][j]=-1*photo1.space[i][j]/A[i][0];
				M[2*i+1][j]=0;
			}
			
			M[2*i][3]=-1*1/A[i][0];   //  4列
			M[2*i+1][3]=0;
			for(j=4;j<=7;j++)//  5 6 7 8列
			{
				M[2*i][j]=0;
				M[2*i+1][j]=M[2*i][j-4];
			}
			for(j=8;j<=10;j++)// 9 10 11列
			{
				M[2*i][j]  =-1*photo1.zuobiaoyi[i][0]*photo1.space[i][j-8]/A[i][0];
				M[2*i+1][j]=-1*photo1.zuobiaoyi[i][1]*photo1.space[i][j-8]/A[i][0];
			}
			
			M[2*i][11]  =-1*(photo1.zuobiaoyi[i][0]-x0)*r[i][0]*r[i][0];// 12 列
			M[2*i+1][11]=-1*(photo1.zuobiaoyi[i][1]-y0)*r[i][0]*r[i][0];

		}
		for(i=0;i<=5;i++)                                                      // 确定W
		{
			W[2*i][0]  =-1*photo1.zuobiaoyi[i][0]/A[i][0];
			W[2*i+1][0]=-1*photo1.zuobiaoyi[i][1]/A[i][0];
		}
		
		photo1.qiuni(M,M,12);
		photo1.time(M,W,L,12,12,1);
		photo1.qiufu(L,12,1);/////////////////////////解出新的L

		photo1.qiuni(M,M,12);
		photo1.time(M,L,ML,12,12,1);
		photo1.plus(ML,W,V,12,1);


		for(i=0;i<6;i++)//更新像平面坐标
			for(int j=0;j<2;j++)
				photo1.zuobiaoyi[i][j]+=V[2*i+j][0];

//		cout<<"输出坐标仪坐标:"<<endl;
//		photo1.display(photo1.zuobiaoyi,6,2);

		x0=-1*(L[0][0]*L[8][0]+L[1][0]*L[9][0]+L[2][0]*L[10][0])/(pow(L[8][0],2)+pow(L[9][0],2)+pow(L[10][0],2));
		y0=-1*(L[4][0]*L[8][0]+L[5][0]*L[9][0]+L[6][0]*L[10][0])/(pow(L[8][0],2)+pow(L[9][0],2)+pow(L[10][0],2));
		_A=( pow(L[0][0],2)+pow(L[1][0],2)+pow(L[2][0],2))	/ ( pow(L[8][0],2)+pow(L[9][0],2)+pow(L[10][0],2))-pow(x0,2);
		_B=( pow(L[4][0],2)+pow(L[5][0],2)+pow(L[6][0],2))	/ ( pow(L[8][0],2)+pow(L[9][0],2)+pow(L[10][0],2))-pow(y0,2);
		_C=( L[4][0]*L[0][0]+L[5][0]*L[1][0]+L[6][0]*L[2][0])	/ ( pow(L[8][0],2)+pow(L[9][0],2)+pow(L[10][0],2))-y0*x0;
		new_fx=sqrt((_A*_B-_C*_C)/_B);


		for(i=0;i<11;i++)
			photo1.L[i][0]=L[i][0];//   存放了最新的L
//		cout<<"L1的迭代:"<<ii<<" 次"<<"new_fx="<<new_fx<<"  x0="<<x0<<"  y0="<<y0<<endl;
//		photo1.display(L,12,1);

		
	}
     while(fabs(new_fx-old_fx)>0.01);//毫米
	 for(i=0;i<11;i++)
			L1[i][0]=L[i][0];//     存放了精确的L        第一张照片
	        photo1_x0=x0;
			photo1_y0=y0;
			photo1_k1=L[11][0];

//			cout<<"L1精确值"<<endl;
//		photo1.display(L1,11,1);                                        //测试
//		cout<<"************************************"<<endl;
			





  ii=0;
	 new_fx=100000;//任取初始值以便循环	
	 x0=-1*(photo2.L[0][0]*photo2.L[8][0]+photo2.L[1][0]*photo2.L[9][0]+photo2.L[2][0]*photo2.L[10][0])/(pow(photo2.L[8][0],2)+pow(photo2.L[9][0],2)+pow(photo2.L[10][0],2));
     y0=-1*(photo2.L[4][0]*photo2.L[8][0]+photo2.L[5][0]*photo2.L[9][0]+photo2.L[6][0]*photo2.L[10][0])/(pow(photo2.L[8][0],2)+pow(photo2.L[9][0],2)+pow(photo2.L[10][0],2));
	do
	{
		ii++;
		old_fx=new_fx;
		for(i=0;i<=5;i++)
			A[i][0]=photo2.L[8][0]*photo2.space[i][0]+photo2.L[9][0]*photo2.space[i][1]+photo2.L[10][0]*photo2.space[i][2]+1;
		for(i=0;i<=5;i++)
			r[i][0]=sqrt( (photo2.zuobiaoyi[i][0]-x0)*(photo2.zuobiaoyi[i][0]-x0) + (photo2.zuobiaoyi[i][1]-y0)*(photo2.zuobiaoyi[i][1]-y0) );
		for(i=0;i<=5;i++)                                                                           // 确定M
		{
			for(int j=0;j<=2;j++) //1 2 3列
			{
				M[2*i][j]=-1*photo2.space[i][j]/A[i][0];
				M[2*i+1][j]=0;
			}
			M[2*i][3]=-1*1/A[i][0];   //  4列
			M[2*i+1][j]=0;
			for(j=4;j<=7;j++)//  5 6 7 8列
			{
				M[2*i][j]=0;
				M[2*i+1][j]=M[2*i][j-4];
			}
			for(j=8;j<=10;j++)// 9 10 11列
			{
				M[2*i][j]  =-1*photo2.zuobiaoyi[i][0]*photo2.space[i][j-8]/A[i][0];
				M[2*i+1][j]=-1*photo2.zuobiaoyi[i][1]*photo2.space[i][j-8]/A[i][0];
			}
			M[2*i][11]  =-1*(photo2.zuobiaoyi[i][0]-x0)*r[i][0]*r[i][0];// 12 列
			M[2*i+1][11]=-1*(photo2.zuobiaoyi[i][1]-y0)*r[i][0]*r[i][0];
		}
		for(i=0;i<=5;i++)                                                                            // 确定W
		{
			W[2*i][0]  =-1*photo2.zuobiaoyi[i][0]/A[i][0];
			W[2*i+1][0]=-1*photo2.zuobiaoyi[i][1]/A[i][0];
		}
		photo2.qiuni(M,M,12);
		photo2.time(M,W,L,12,12,1);/////////////////////////解出新的L
		photo2.qiufu(L,12,1);
		photo2.qiuni(M,M,12);

		photo2.time(M,L,ML,12,12,1);
		photo2.plus(ML,W,V,12,1);
		for(i=0;i<6;i++)//更新像平面坐标
			for(int j=0;j<2;j++)
				photo2.zuobiaoyi[i][j]+=V[2*i+j][0];

		x0=-1*(L[0][0]*L[8][0]+L[1][0]*L[9][0]+L[2][0]*L[10][0])/(pow(L[8][0],2)+pow(L[9][0],2)+pow(L[10][0],2));
		y0=-1*(L[4][0]*L[8][0]+L[5][0]*L[9][0]+L[6][0]*L[10][0])/(pow(L[8][0],2)+pow(L[9][0],2)+pow(L[10][0],2));
		_A=( pow(L[0][0],2)+pow(L[1][0],2)+pow(L[2][0],2))	/ ( pow(L[8][0],2)+pow(L[9][0],2)+pow(L[10][0],2))-pow(x0,2);
		_B=( pow(L[4][0],2)+pow(L[5][0],2)+pow(L[6][0],2))	/ ( pow(L[8][0],2)+pow(L[9][0],2)+pow(L[10][0],2))-pow(y0,2);
		_C=( L[4][0]*L[0][0]+L[5][0]*L[1][0]+L[6][0]*L[2][0])	/( pow(L[8][0],2)+pow(L[9][0],2)+pow(L[10][0],2))-y0*x0;
		new_fx=sqrt((_A*_B-_C*_C)/_B);

		for(i=0;i<11;i++)
			photo2.L[i][0]=L[i][0];//     存放了最新的L

//		cout<<"L2的迭代:"<<ii<<" 次"<<"new_fx="<<new_fx<<"  x0="<<x0<<"  y0="<<y0<<endl;
//		photo2.display(L,12,1);
		
	}
     while(fabs(new_fx-old_fx)>0.01);//毫米

	 for(i=0;i<11;i++)
			L2[i][0]=L[i][0];//     存放了精确的L        第二张照片
	        photo2_x0=x0;
			photo2_y0=y0;
			photo2_k1=L[11][0];

//			cout<<"L2精确值"<<endl;
//		photo2.display(L2,11,1);
//		cout<<"************************************"<<endl;      //测试



//////////////////////////////    4     ////////////////////////////////////////

		double **N,**Q,**S,**v;
		double A1,A2;//两张相片各取一点,各自对应的A
		double **Nt,**Nt_N,**NNN,**NS;//中间矩阵

		
		N=new double* [4];		
			for( i=0;i<4;i++)
				N[i]=new double [3];
		Q=new double* [4];		
			for( i=0;i<4;i++)
				Q[i]=new double [1];
		NS=new double* [4];		
			for( i=0;i<4;i++)
				NS[i]=new double [1];
		v=new double* [4];		
			for( i=0;i<4;i++)
				v[i]=new double [1];
		S=new double* [3];		
			for( i=0;i<3;i++)
				S[i]=new double [1];

		Nt=new double* [3];		
			for( i=0;i<3;i++)
				Nt[i]=new double [4];
	    Nt_N=new double* [3];		
			for( i=0;i<3;i++)
				Nt_N[i]=new double [3];
	    NNN=new double* [3];		
			for( i=0;i<3;i++)
				NNN[i]=new double [4];

/////////////////////////////////////////////////////////以下循环
			coordinate_zuobiaoyi[0][0]+=photo1_k1*(coordinate_zuobiaoyi[0][0]-photo1_x0)*(pow((coordinate_zuobiaoyi[0][0]-photo1_x0),2)+pow((coordinate_zuobiaoyi[0][1]-photo1_y0),2));
			coordinate_zuobiaoyi[0][1]+=photo1_k1*(coordinate_zuobiaoyi[0][1]-photo1_y0)*(pow((coordinate_zuobiaoyi[0][0]-photo1_x0),2)+pow((coordinate_zuobiaoyi[0][1]-photo1_y0),2));
			coordinate_zuobiaoyi[1][0]+=photo2_k1*(coordinate_zuobiaoyi[1][0]-photo2_x0)*(pow((coordinate_zuobiaoyi[1][0]-photo2_x0),2)+pow((coordinate_zuobiaoyi[1][1]-photo2_y0),2));
			coordinate_zuobiaoyi[1][1]+=photo2_k1*(coordinate_zuobiaoyi[1][1]-photo2_y0)*(pow((coordinate_zuobiaoyi[1][0]-photo2_x0),2)+pow((coordinate_zuobiaoyi[1][1]-photo2_y0),2));
	
	//		cout<<coordinate_zuobiaoyi[0][0]<<" "<<coordinate_zuobiaoyi[0][1]<<endl;
	//		cout<<coordinate_zuobiaoyi[1][0]<<" "<<coordinate_zuobiaoyi[1][1]<<endl;

			S[0][0]=coordinate_space[0][0];
			S[1][0]=coordinate_space[1][0];
			S[2][0]=coordinate_space[2][0];
		do
		{

			coordinate_space[0][0]=S[0][0];    //cout<<coordinate_space[0][0]<<endl;
			coordinate_space[1][0]=S[1][0];   // cout<<coordinate_space[1][0]<<endl;
			coordinate_space[2][0]=S[2][0];   // cout<<coordinate_space[2][0]<<endl;

			A1=L1[8][0]*coordinate_space[0][0]+L1[9][0]*coordinate_space[1][0]+L1[10][0]*coordinate_space[2][0]+1;
			A2=L2[8][0]*coordinate_space[0][0]+L2[9][0]*coordinate_space[1][0]+L2[10][0]*coordinate_space[2][0]+1;

			

			N[0][0]=-1*(L1[0][0]+L1[8][0]*coordinate_zuobiaoyi[0][0])/A1;   ///确定N
			N[0][1]=-1*(L1[1][0]+L1[9][0]*coordinate_zuobiaoyi[0][0])/A1;
			N[0][2]=-1*(L1[2][0]+L1[10][0]*coordinate_zuobiaoyi[0][0])/A1;

			N[1][0]=-1*(L1[4][0]+L1[8][0]*coordinate_zuobiaoyi[0][1])/A1;
			N[1][1]=-1*(L1[5][0]+L1[9][0]*coordinate_zuobiaoyi[0][1])/A1;
			N[1][2]=-1*(L1[6][0]+L1[10][0]*coordinate_zuobiaoyi[0][1])/A1;

			N[2][0]=-1*(L2[0][0]+L2[8][0]*coordinate_zuobiaoyi[1][0])/A2;
			N[2][1]=-1*(L2[1][0]+L2[9][0]*coordinate_zuobiaoyi[1][0])/A2;
			N[2][2]=-1*(L2[2][0]+L2[10][0]*coordinate_zuobiaoyi[1][0])/A2;

			N[3][0]=-1*(L2[4][0]+L2[8][0]*coordinate_zuobiaoyi[1][1])/A2;
			N[3][1]=-1*(L2[5][0]+L2[9][0]*coordinate_zuobiaoyi[1][1])/A2;
			N[3][2]=-1*(L2[6][0]+L2[10][0]*coordinate_zuobiaoyi[1][1])/A2;


			Q[0][0]=-1*(L1[3][0]+coordinate_zuobiaoyi[0][0])/A1;//            确定Q
			Q[1][0]=-1*(L1[7][0]+coordinate_zuobiaoyi[0][1])/A1;
			Q[2][0]=-1*(L2[3][0]+coordinate_zuobiaoyi[1][0])/A2;
			Q[3][0]=-1*(L2[7][0]+coordinate_zuobiaoyi[1][1])/A2;


			photo.zhuanzhi(N,Nt,4,3);
			photo.time(Nt,N,Nt_N,3,4,3);
			photo.qiuni(Nt_N,Nt_N,3);
			photo.time(Nt_N,Nt,NNN,3,3,4);
			photo.time(NNN,Q,S,3,4,1);
			photo.qiufu(S,3,1);
			photo.time(N,S,NS,4,3,1);
			photo.plus(NS,Q,v,4,1);//更新待定点的像片坐标
			coordinate_zuobiaoyi[0][0]+=v[0][0];
			coordinate_zuobiaoyi[0][1]+=v[1][0];
			coordinate_zuobiaoyi[1][0]+=v[2][0];
			coordinate_zuobiaoyi[1][1]+=v[3][0];

		}
		while (fabs(S[0][0]-coordinate_space[0][0])>0.0001||fabs(S[1][0]-coordinate_space[1][0])>0.0001||fabs(S[2][0]-coordinate_space[2][0])>0.0001);

		cout<<"同名相点对应的物方精确坐标是:"<<endl;
		cout<<"X: "<<S[0][0]<<"  "<<"Y "<<S[1][0]<<" "<<"Z: "<<S[2][0]<<endl;
		outfile<<"          精确坐标是:"<<endl;
		outfile<<"                                "<<S[0][0]<<"  "<<S[1][0]<<" "<<S[2][0]<<endl;
		outfile<<"          较差是:(毫米)"<<endl;
		
			double x,y,z;
			x=fabs(S[0][0]-kongjian[k][0])*1000;
			y=fabs(S[1][0]-kongjian[k][1])*1000;
			z=fabs(S[2][0]-kongjian[k][2])*1000;
			if(x<0.1)   x=0;
			if(y<0.1)   y=0;
			if(z<0.1)   z=0;
		
		outfile<<"                                "<<x<<"  "<<y<<"  "<<z<<endl;
 }

}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -