您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 市场营销 > DLT直接线性变换解法程序
DLT直接线性变换解法程序介绍一、程序综合介绍:DLT结算程序程序功能介绍:应用6个已知点计算左右片l系数;然后应用已经求得的l系数求解物方空间坐标系坐标程序名:SuYGDLT程序界面:程序界面有四个按钮,分别为读取文件,左片l系数计算,右片系数计算,物放坐标解算程序界面有四个编辑框,分别用来输出文件信息,左片l系数、右片l系数、以及无妨坐标结果截图如下程序使用介绍:必须先点击导入文件按钮,导入文件方可进行正确的计算,如果未导入文件就点击左片平差或右片平差或无妨坐标解算就会弹出如下对话框:读取数据后点击其它按钮进行其它计算。程序文件格式:数据文件分为两部分,KnownPoint,UNKnownPoint,分别代表已知点信息和待求点信息当文件读取程序读到“KnownPoint”时开始读取已知点信息,已知点信息格式如下GCP1,1214.0000,1032.0000,1046.5180,1071.6652,9.201742,-9.672384,-2.726064分别代表点名、左片相片X坐标、左片相片y坐标、右片相片x坐标、右片相片y坐标物方坐标X、Y、Z;当文件读取到“ENDKnownPoint”时结束已知坐标的读取待求点信息类似:文件格式截图如下:程序运行结果与评估:本程序区1-10号点作为已知点计算l近似值11-20号点作为未知点解求其物方三维坐标;程序运行结果与所给参考值相似,应该可以证明其运算是正确的,运行结果截图如下:二、程序编程思想及相关代码程序编程思想及相关函数:本程序设计DLTCalculation类作为l系数结算主程序,其成员变量及成员函数与作用介绍如下:CSuLMatrixLL;//左片L系数矩阵CSuLMatrixRL;//右片L系数矩阵intm_iKnownPointCount;//已知点个数CControlPoint*m_pKnownPoint;//已知点intm_iUnKnownPointCount;//未知点个数CControlPoint*m_pUnKnownPoint;//未知点public:CStringLoadData(constCString&strFileName);//读取文件函数intifLoda;//判断是否导入数据CStringDatainfor;//文件信息存储CString*SplitString(CStringstr,charsplit,int&iSubStrs);//分割函数voidLFormApproL(CSuLMatrix&LL);//计算左片L系数近似值voidRFormApproL(CSuLMatrix&RL);//计算右片L系数近似值voidFormLErrorEquations(CSuLMatrixLL,CMatrix&LM,CMatrix&LW);//组成左片系数矩阵和常数项矩阵voidLAdjust();//左片平差主函数voidFormRErrorEquations(CSuLMatrixRL,CMatrix&RM,CMatrix&RW);//组成右片系数矩阵和常数项矩阵voidRAdjust();//右片平差主函数voidOutput(constCString&strFileName);//输出结果主程序voidOutMatrixToFile(constCMatrix&mat,CStdioFile&SF);//输出矩阵总程序另外设计类qianfangjiaohui作为结算物放坐标解算主程序其成员变量与成员函数及其作用介绍如下:voidFormApproCoor(DLTCalculation&R);//计算无妨坐标近似值voidFormErrorEquations(DLTCalculation&R,CMatrix&N,CMatrix&Q);//解求系数矩阵voidAdjust(DLTCalculation&R);//平差计算物放坐标程序详细代码粘贴如下:以下为类DLTCalculation.cpp文件详细内容:#includeStdAfx.h#includeDLTCalculation.h#includelocale#includeSuLMatrix.hDLTCalculation::DLTCalculation(void){ifLoda=0;}DLTCalculation::~DLTCalculation(void){}CString*DLTCalculation::SplitString(CStringstr,charsplit,int&iSubStrs){intiPos=0;//分割符位置intiNums=0;//分割符的总数CStringstrTemp=str;CStringstrRight;//先计算子字符串的数量while(iPos!=-1){iPos=strTemp.Find(split);if(iPos==-1){break;}strRight=strTemp.Mid(iPos+1,str.GetLength());strTemp=strRight;iNums++;}if(iNums==0)//没有找到分割符{//子字符串数就是字符串本身iSubStrs=1;returnNULL;}//子字符串数组iSubStrs=iNums+1;//子串的数量=分割符数量+1CString*pStrSplit;pStrSplit=newCString[iSubStrs];strTemp=str;CStringstrLeft;for(inti=0;iiNums;i++){iPos=strTemp.Find(split);//左子串strLeft=strTemp.Left(iPos);//右子串strRight=strTemp.Mid(iPos+1,strTemp.GetLength());strTemp=strRight;pStrSplit[i]=strLeft;}pStrSplit[iNums]=strTemp;returnpStrSplit;}CStringDLTCalculation::LoadData(constCString&strFileName){ifLoda=1;CStringstrputdata;//用于保存观测文件的字符串CStdioFilesf;//创建文件对象setlocale(LC_ALL,);//设置语言环境if(!sf.Open(strFileName,CFile::modeRead))return_T(文件打开失败);;//以读的形式打来文件,如果打开失败则返回CStringstrLine;intn;CString*strTmp=NULL;do{sf.ReadString(strLine);strputdata+=strLine;strputdata+=_T(\r\n);}while(strLine!=KnownPoint);Datainfor=strputdata;if(strLine==KnownPoint)//读取已知数据while(strLine!=_T(ENDKnownPoint)){sf.ReadString(strLine);strputdata+=strLine;strputdata+=_T(\r\n);if(strLine!=_T(ENDKnownPoint)){strTmp=SplitString(strLine,',',n);}elsebreak;if(strTmp[0]==KnownPointCount){m_iKnownPointCount=_ttoi(strTmp[1]);m_pKnownPoint=newCControlPoint[m_iKnownPointCount];if(strTmp!=NULL)//释放内存{delete[]strTmp;strTmp=NULL;}for(inti=0;im_iKnownPointCount;i++){sf.ReadString(strLine);strputdata+=strLine;strputdata+=_T(\r\n);strTmp=SplitString(strLine,',',n);m_pKnownPoint[i].strName=strTmp[0];m_pKnownPoint[i].Lx=_tstof(strTmp[1]);m_pKnownPoint[i].Ly=_tstof(strTmp[2]);m_pKnownPoint[i].Rx=_tstof(strTmp[3]);m_pKnownPoint[i].Ry=_tstof(strTmp[4]);m_pKnownPoint[i].X=_tstof(strTmp[5]);m_pKnownPoint[i].Y=_tstof(strTmp[6]);m_pKnownPoint[i].Z=_tstof(strTmp[7]);if(strTmp!=NULL)//释放内存{delete[]strTmp;strTmp=NULL;}}}}sf.ReadString(strLine);strputdata+=strLine;strputdata+=_T(\r\n);if(strLine==UnknownPoint)//读取未知数据{while(strLine!=_T(ENDUnknownPoint)){sf.ReadString(strLine);strputdata+=strLine;strputdata+=_T(\r\n);if(strLine!=_T(ENDUnknownPoint)){strTmp=SplitString(strLine,',',n);}elsebreak;if(strTmp[0]==UnknownPointCount){m_iUnKnownPointCount=_ttoi(strTmp[1]);m_pUnKnownPoint=newCControlPoint[m_iUnKnownPointCount];if(strTmp!=NULL)//释放内存{delete[]strTmp;strTmp=NULL;}for(inti=0;im_iUnKnownPointCount;i++){sf.ReadString(strLine);strputdata+=strLine;strputdata+=_T(\r\n);strTmp=SplitString(strLine,',',n);m_pUnKnownPoint[i].strName=strTmp[0];m_pUnKnownPoint[i].Lx=_tstof(strTmp[1]);m_pUnKnownPoint[i].Ly=_tstof(strTmp[2]);m_pUnKnownPoint[i].Rx=_tstof(strTmp[3]);m_pUnKnownPoint[i].Ry=_tstof(strTmp[4]);if(strTmp!=NULL)//释放内存{delete[]strTmp;strTmp=NULL;}}}}}sf.Close();returnstrputdata;}voidDLTCalculation::LFormApproL(CSuLMatrix&LL)//计算左片L系数近似值{CMatrixLX(11,1);CMatrixLB(11,11);CMatrixLf(11,1);for(inti=0;i5;i++){LB(2*i,0)=LB(2*i+1,4)=m_pKnownPoint[i].X*1000;LB(2*i,1)=LB(2*i+1,5)=m_pKnownPoint[i].Y*1000;LB(2*i,2)=LB(2*i+1,6)=m_pKnownPoint[i].Z*1000;LB(2*i,3)=LB(2*i+1,7)=1;LB(2*i,4)=LB(2*i,5)=LB(2*i,6)=LB(2*i,7)=LB(2*i+1,0)=LB(2*i+1,1)=LB(2*i+1,2)=LB(2*i+1,3)=
本文标题:DLT直接线性变换解法程序
链接地址:https://www.777doc.com/doc-2910043 .html