Code/Resource
Windows Develop
Linux-Unix program
Internet-Socket-Network
Web Server
Browser Client
Ftp Server
Ftp Client
Browser Plugins
Proxy Server
Email Server
Email Client
WEB Mail
Firewall-Security
Telnet Server
Telnet Client
ICQ-IM-Chat
Search Engine
Sniffer Package capture
Remote Control
xml-soap-webservice
P2P
WEB(ASP,PHP,...)
TCP/IP Stack
SNMP
Grid Computing
SilverLight
DNS
Cluster Service
Network Security
Communication-Mobile
Game Program
Editor
Multimedia program
Graph program
Compiler program
Compress-Decompress algrithms
Crypt_Decrypt algrithms
Mathimatics-Numerical algorithms
MultiLanguage
Disk/Storage
Java Develop
assembly language
Applications
Other systems
Database system
Embeded-SCM Develop
FlashMX/Flex
source in ebook
Delphi VCL
OS Develop
MiddleWare
MPI
MacOS develop
LabView
ELanguage
Software/Tools
E-Books
Artical/Document
DLTDlg.cpp
Package: DLT.rar [view]
Upload User: szacenet
Upload Date: 2022-06-20
Package Size: 317k
Code Size: 22k
Category:
Graph program
Development Platform:
Visual C++
- // DLTDlg.cpp : implementation file
- //
- #include "stdafx.h"
- #include "DLT.h"
- #include "DLTDlg.h"
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- /////////////////////////////////////////////////////////////////////////////
- // CAboutDlg dialog used for App About
- class CAboutDlg : public CDialog
- {
- public:
- CAboutDlg();
- // Dialog Data
- //{{AFX_DATA(CAboutDlg)
- enum { IDD = IDD_ABOUTBOX };
- //}}AFX_DATA
- // ClassWizard generated virtual function overrides
- //{{AFX_VIRTUAL(CAboutDlg)
- protected:
- virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
- //}}AFX_VIRTUAL
- // Implementation
- protected:
- //{{AFX_MSG(CAboutDlg)
- //}}AFX_MSG
- DECLARE_MESSAGE_MAP()
- };
- CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
- {
- //{{AFX_DATA_INIT(CAboutDlg)
- //}}AFX_DATA_INIT
- }
- void CAboutDlg::DoDataExchange(CDataExchange* pDX)
- {
- CDialog::DoDataExchange(pDX);
- //{{AFX_DATA_MAP(CAboutDlg)
- //}}AFX_DATA_MAP
- }
- BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
- //{{AFX_MSG_MAP(CAboutDlg)
- // No message handlers
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
- /////////////////////////////////////////////////////////////////////////////
- // CDLTDlg dialog
- CDLTDlg::CDLTDlg(CWnd* pParent /*=NULL*/)
- : CDialog(CDLTDlg::IDD, pParent)
- {
- //{{AFX_DATA_INIT(CDLTDlg)
- //}}AFX_DATA_INIT
- // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
- m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
- pLeftLi = new double[12];//li系数精确值,k
- pRightLi = new double[12];//li系数精确值,k
- pLOrient = new double [11];
- pROrient = new double [11];
- }
- void CDLTDlg::DoDataExchange(CDataExchange* pDX)
- {
- CDialog::DoDataExchange(pDX);
- //{{AFX_DATA_MAP(CDLTDlg)
- //}}AFX_DATA_MAP
- }
- BEGIN_MESSAGE_MAP(CDLTDlg, CDialog)
- //{{AFX_MSG_MAP(CDLTDlg)
- ON_WM_SYSCOMMAND()
- ON_WM_PAINT()
- ON_WM_QUERYDRAGICON()
- ON_BN_CLICKED(IDC_BUTN_CTRL, OnButnCtrl)
- ON_BN_CLICKED(IDC_BUTN_LEFT, OnButnLeft)
- ON_BN_CLICKED(IDC_BUTN_RIGHT, OnButnRight)
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
- /////////////////////////////////////////////////////////////////////////////
- // CDLTDlg message handlers
- BOOL CDLTDlg::OnInitDialog()
- {
- CDialog::OnInitDialog();
- // Add "About..." menu item to system menu.
- // IDM_ABOUTBOX must be in the system command range.
- ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
- ASSERT(IDM_ABOUTBOX < 0xF000);
- CMenu* pSysMenu = GetSystemMenu(FALSE);
- if (pSysMenu != NULL)
- {
- CString strAboutMenu;
- strAboutMenu.LoadString(IDS_ABOUTBOX);
- if (!strAboutMenu.IsEmpty())
- {
- pSysMenu->AppendMenu(MF_SEPARATOR);
- pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
- }
- }
- // Set the icon for this dialog. The framework does this automatically
- // when the application's main window is not a dialog
- SetIcon(m_hIcon, TRUE); // Set big icon
- SetIcon(m_hIcon, FALSE); // Set small icon
- // TODO: Add extra initialization here
- return TRUE; // return TRUE unless you set the focus to a control
- }
- void CDLTDlg::OnSysCommand(UINT nID, LPARAM lParam)
- {
- if ((nID & 0xFFF0) == IDM_ABOUTBOX)
- {
- CAboutDlg dlgAbout;
- dlgAbout.DoModal();
- }
- else
- {
- CDialog::OnSysCommand(nID, lParam);
- }
- }
- // If you add a minimize button to your dialog, you will need the code below
- // to draw the icon. For MFC applications using the document/view model,
- // this is automatically done for you by the framework.
- void CDLTDlg::OnPaint()
- {
- if (IsIconic())
- {
- CPaintDC dc(this); // device context for painting
- SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
- // Center icon in client rectangle
- int cxIcon = GetSystemMetrics(SM_CXICON);
- int cyIcon = GetSystemMetrics(SM_CYICON);
- CRect rect;
- GetClientRect(&rect);
- int x = (rect.Width() - cxIcon + 1) / 2;
- int y = (rect.Height() - cyIcon + 1) / 2;
- // Draw the icon
- dc.DrawIcon(x, y, m_hIcon);
- }
- else
- {
- CDialog::OnPaint();
- }
- }
- // The system calls this to obtain the cursor to display while the user drags
- // the minimized window.
- HCURSOR CDLTDlg::OnQueryDragIcon()
- {
- return (HCURSOR) m_hIcon;
- }
- void CDLTDlg::OnOK()
- {
- // TODO: Add extra validation here
- if (m_CtrlPoints.size()==0 ||m_LeftPoints.size() == 0 || m_RightPoints.size()==0)
- {
- MessageBox("请先输入数据");
- return ;
- }
- CalXYZAndPrecision(m_LeftPoints,m_RightPoints,pLOrient,pROrient,pLeftLi,pRightLi);
- if(ShellExecute(NULL,"open",strResultFileName,NULL,NULL,SW_SHOWNORMAL) < (HANDLE)32)
- MessageBox("结果保存在:"+strResultFileName,"TipS",MB_OK|MB_ICONINFORMATION);
- //CDialog::OnOK();
- }
- void CDLTDlg::OnButnLeft()
- {
- // TODO: Add your control notification handler code here
- if(m_CtrlPoints.size()==0)
- {
- MessageBox("无控制点数据","ERROR",MB_OK|MB_ICONWARNING);
- return;
- }
- //读取数据
- m_LeftPoints.clear();
- CString filename = OpenFileStore(&m_LeftPoints);
- if (m_LeftPoints.size()<6)
- {
- MessageBox("量测像点数目太少,不能计算!","Tips",MB_OK|MB_ICONINFORMATION);
- m_LeftPoints.clear();
- SetDlgItemText(IDC_BUTN_LEFT,"");
- return;
- }
- SetDlgItemText(IDC_EDIT_LEFT,filename);
- //////////////////////////////////////////////////
- //计算li系数近似值
- FILE *fp;
- fp = fopen(strResultFileName,"a+");
- double *pLi = new double [11];
- if(!CalApproximateLiFactors(m_LeftPoints,m_CtrlPoints,pLi))
- {
- MessageBox("像点对应的控制点不足6个,无法计算!");
- m_LeftPoints.clear();
- SetDlgItemText(IDC_BUTN_LEFT,"");
- return ;
- }
- //计算li系数精确值,k和方位元素
- int nCnt = CalOrtAndLiFactors(m_LeftPoints,m_CtrlPoints,pLi,pLOrient,pLeftLi);
- fprintf(fp,"左片"+filename+"的li系数如下:n 近似值 精确值n");
- for (int i = 0;i<11;i++)
- {
- fprintf(fp,"l%d %.6f %.6fn",i,pLi[i],pLeftLi[i]);
- }
- fprintf(fp,"对称径向畸变系数k:%.6fn迭代次数:%dn",pLeftLi[i],nCnt);
- //输出方位元素
- CString strFWs[11] ={"x0","y0","fx","ds","dB","Xs","Ys","Zs","t(phi)","w","k"};
- for ( i = 0;i<11;i++)
- {
- fprintf(fp,"%s %.6fn",strFWs[i],pLOrient[i]);
- }
- fclose(fp);
- delete [] pLi;
- /////////////////////////
- }
- void CDLTDlg::OnButnRight()
- {
- // TODO: Add your control notification handler code here
- if(m_CtrlPoints.size()==0)
- {
- MessageBox("无控制点数据","ERROR",MB_OK|MB_ICONWARNING);
- return;
- }
- m_RightPoints.clear();
- CString filename = OpenFileStore(&m_RightPoints);
- if (m_RightPoints.size()<6)
- {
- MessageBox("量测像点数目太少,不能计算!","Tips",MB_OK|MB_ICONINFORMATION);
- m_RightPoints.clear();
- SetDlgItemText(IDC_BUTN_RIGHT,"");
- return;
- }
- SetDlgItemText(IDC_EDIT_RIGHT,filename);
- //////////////////////////
- FILE *fp;
- fp = fopen(strResultFileName,"a+");
- double *pLi = new double [11];
- if(!CalApproximateLiFactors(m_RightPoints,m_CtrlPoints,pLi))
- {
- MessageBox("像点对应的控制点不足6个,无法计算!");
- m_RightPoints.clear();
- SetDlgItemText(IDC_BUTN_LEFT,"");
- return ;
- }
- //计算li系数精确值,k和方位元素
- int nCnt = CalOrtAndLiFactors(m_RightPoints,m_CtrlPoints,pLi,pROrient,pRightLi);
- fprintf(fp,"右片"+filename+"的li系数如下:n 近似值 精确值n");
- for (int i = 0;i<11;i++)
- {
- fprintf(fp,"l%d %.6f %.6fn",i,pLi[i],pRightLi[i]);
- }
- fprintf(fp,"对称径向畸变系数k:%.6fn迭代次数:%dn",pRightLi[i],nCnt);
- //输出方位元素
- CString strFWs[11] ={"x0","y0","fx","ds","dB","Xs","Ys","Zs","t(phi)","w","k"};
- for ( i = 0;i<11;i++)
- {
- fprintf(fp,"%s %.6fn",strFWs[i],pROrient[i]);
- }
- fclose(fp);
- delete [] pLi;
- /////////////////////////
- }
- void CDLTDlg::OnButnCtrl()
- {
- // TODO: Add your control notification handler code here
- m_CtrlPoints.clear();
- CString filename = OpenFileStore(&m_CtrlPoints);
- if(filename=="") return ;
- if (m_CtrlPoints.size()<6)
- {
- MessageBox("控制点数目太少,不能计算!","Tips",MB_OK|MB_ICONINFORMATION);
- m_CtrlPoints.clear();
- SetDlgItemText(IDC_BUTN_CTRL,"");
- return;
- }
- SetDlgItemText(IDC_EDIT_CTRL,filename);
- strResultFileName = filename.Left(filename.ReverseFind('\')+1)+"\DLT_Results.txt";
- }
- CString CDLTDlg::OpenFileStore(vector<PixPoint> * Container )
- {
- CString strFilename = "";
- Container->clear();
- CFileDialog openFile(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"文本文件(*.txt)|*.txt||",NULL);
- if (openFile.DoModal()==IDCANCEL)
- return "";
- strFilename = openFile.GetPathName();
- //read data
- CStdioFile pInFile;
- if (!pInFile.Open(strFilename, CFile::modeRead))
- return "";
- int nNum =0 ;//point order number
- double x = 0.0;//
- double y = 0.0;
- CString strLine;
- while (pInFile.ReadString(strLine))
- {
- //strLine是一行文本
- PixPoint point;
- sscanf(strLine,"%d %lf %lf",&nNum,&x,&y);
- point.ID = nNum;
- point.x = x;//PixPoint(nNum,x,y);
- point.y = y;
- Container->push_back(point);
- }
- pInFile.Close();
- return strFilename;
- }
- CString CDLTDlg::OpenFileStore(vector<GeodeticPoint> * Container )
- {
- CString strFilename = "";
- Container->clear();
- CFileDialog openFile(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"文本文件(*.txt)|*.txt||",NULL);
- if (openFile.DoModal()==IDCANCEL)
- return "";
- strFilename = openFile.GetPathName();
- //read data
- CStdioFile pInFile;
- if (!pInFile.Open(strFilename, CFile::modeRead))
- return "";
- int nNum =0 ;//point order number
- double x = 0.0;//
- double y = 0.0;
- double z =0.0;
- CString strLine;
- while (pInFile.ReadString(strLine))
- {
- //strLine是一行文本
- GeodeticPoint point;
- sscanf(strLine,"%d %lf %lf %lf",&nNum,&x,&y,&z);
- point.ID = nNum;
- point.x = x;//GeodeticPoint(nNum,x,y,z);
- point.y = y;
- point.z = z;
- Container->push_back(point);
- }
- pInFile.Close();
- return strFilename;
- }
- bool CDLTDlg::CalApproximateLiFactors(vector<PixPoint> xPixContner,vector<GeodeticPoint> CtrlContner,double *pPara)
- {
- //搜索像点对应的控制点
- vector<GeodeticPoint> CalCtrlPts;
- vector<PixPoint>PixContner;
- for (int i =0;i<xPixContner.size();i++)
- {
- for(int j = 0;j<CtrlContner.size();j++)
- {
- if (xPixContner.at(i).ID == CtrlContner.at(j).ID)
- {
- CalCtrlPts.push_back(CtrlContner.at(j));
- PixContner.push_back(xPixContner.at(i));
- break;
- }
- }
- }
- int nCalPtsNum = CalCtrlPts.size();
- if (nCalPtsNum<6)
- return false;
- //计算li系数的近似解approximate calculation
- double * LiApproA = new double[nCalPtsNum*2*11];
- double * LiApproC = new double[nCalPtsNum * 2];
- for (i = 0;i<nCalPtsNum;i++)//逐点计算系数
- {
- LiApproA[22*i + 0] = CalCtrlPts.at(i).x;
- LiApproA[22*i + 1] = CalCtrlPts.at(i).y;
- LiApproA[22*i + 2] = CalCtrlPts.at(i).z;
- LiApproA[22*i + 3] = 1;
- LiApproA[22*i + 4] = 0;
- LiApproA[22*i + 5] = 0;
- LiApproA[22*i + 6] = 0;
- LiApproA[22*i + 7] = 0;
- LiApproA[22*i + 8] = PixContner.at(i).x * CalCtrlPts.at(i).x;
- LiApproA[22*i + 9] = PixContner.at(i).x * CalCtrlPts.at(i).y;
- LiApproA[22*i + 10] = PixContner.at(i).x * CalCtrlPts.at(i).z;
- LiApproA[22*i + 11] = 0;
- LiApproA[22*i + 12] = 0;
- LiApproA[22*i + 13] = 0;
- LiApproA[22*i + 14] = 0;
- LiApproA[22*i + 15] = CalCtrlPts.at(i).x;
- LiApproA[22*i + 16] = CalCtrlPts.at(i).y;
- LiApproA[22*i + 17] = CalCtrlPts.at(i).z;
- LiApproA[22*i + 18] = 1;
- LiApproA[22*i + 19] = PixContner.at(i).y * CalCtrlPts.at(i).x;
- LiApproA[22*i + 20] = PixContner.at(i).y * CalCtrlPts.at(i).y;
- LiApproA[22*i + 21] = PixContner.at(i).y * CalCtrlPts.at(i).z;
- LiApproC[2*i + 0] = -1*PixContner.at(i).x;
- LiApproC[2*i + 1] = -1*PixContner.at(i).y;
- }
- double * LiApproAt = new double[nCalPtsNum*2*11];//A的转置
- double * LiApproAtA = new double[11*11];//A的转置 乘以 A
- double * LiApproAtC = new double[11];
- transpose(LiApproA,LiApproAt,nCalPtsNum*2,11);
- mult(LiApproAt,LiApproA,LiApproAtA,11,nCalPtsNum*2,11);
- inv(LiApproAtA,11);//LiApproAtA的逆仍为LiApproAtA
- mult(LiApproAt,LiApproC,LiApproAtC,11,nCalPtsNum*2,1);
- mult(LiApproAtA,LiApproAtC,pPara,11,11,1);
- //释放临时内存
- delete [] LiApproA;
- delete [] LiApproAt;
- delete [] LiApproAtA;
- delete [] LiApproAtC;
- delete [] LiApproC;
- CalCtrlPts.clear();
- PixContner.clear();
- return true;
- }
- //返回pElement和pTrueLi,pElems中的顺序依次为x0,y0,fx,ds,dB,Xs,Ys,Zs,t(phi),w,k ; pTrueLi中为L1-L11和k
- int CDLTDlg::CalOrtAndLiFactors(vector<PixPoint> xPixContner,vector<GeodeticPoint> CtrlContner,double *li,double *pElems,double *pTrueLi)
- {
- //搜索像点对应的控制点
- vector<GeodeticPoint> CalCtrlPts;
- vector<PixPoint>PixContner;
- for (int i =0;i<xPixContner.size();i++)
- {
- for(int j = 0;j<CtrlContner.size();j++)
- {
- if (xPixContner.at(i).ID == CtrlContner.at(j).ID)
- {
- CalCtrlPts.push_back(CtrlContner.at(j));
- PixContner.push_back(xPixContner.at(i));
- break;
- }
- }
- }
- ///////////////////////////////////////////////////////////
- int nCalPtsNum = CalCtrlPts.size();
- double x0,y0,r2;//r2为像点到像主点的距离平方
- BOOL bFlag = true;//迭代标志
- double * pL = new double [12];//前11个为li
- for (i =0;i<11;i++)
- pL[i] = li[i];
- pL[i] = 0.0;
- //分配临时存储空间
- double * M = new double[nCalPtsNum*2*12];
- double * W = new double[nCalPtsNum * 2];
- double * Mt = new double[nCalPtsNum*2*12];//M的转置
- double * MtM = new double[12*12];//M的转置 乘以 M
- double * MtW = new double[12];
- double xoyofenmu,A,B,C,fx,r32;//r3的平方
- int nIterationCnt = 0;
- while(bFlag)
- {
- nIterationCnt++;
- if (nIterationCnt == 101)
- {
- //MessageBox("迭代次数达到100次","Error",MB_OK|MB_ICONWARNING);
- return -1;
- }
- xoyofenmu = pL[8]*pL[8] + pL[9]*pL[9] + pL[10]*pL[10];
- x0 = -(pL[0]*pL[8] + pL[1]*pL[9] + pL[2]*pL[10])/xoyofenmu;
- y0 = -(pL[4]*pL[8] + pL[5]*pL[9] + pL[6]*pL[10])/xoyofenmu;
- //逐点计算系数
- for (i = 0;i<nCalPtsNum;i++)
- {
- A = pL[8]*CalCtrlPts.at(i).x + pL[9]*CalCtrlPts.at(i).y + pL[10]*CalCtrlPts.at(i).z + 1;
- r2 = pow(PixContner.at(i).x - x0,2) + pow(PixContner.at(i).y - y0,2);
- M[24*i + 0] = -CalCtrlPts.at(i).x/A;
- M[24*i + 1] = -CalCtrlPts.at(i).y/A;
- M[24*i + 2] = -CalCtrlPts.at(i).z/A;
- M[24*i + 3] = -1/A;
- M[24*i + 4] = 0;
- M[24*i + 5] = 0;
- M[24*i + 6] = 0;
- M[24*i + 7] = 0;
- M[24*i + 8] = -PixContner.at(i).x * CalCtrlPts.at(i).x/A;
- M[24*i + 9] = -PixContner.at(i).x * CalCtrlPts.at(i).y/A;
- M[24*i + 10] = -PixContner.at(i).x * CalCtrlPts.at(i).z/A;
- M[24*i + 11] = -(PixContner.at(i).x - x0)*r2;
- M[24*i + 12] = 0;
- M[24*i + 13] = 0;
- M[24*i + 14] = 0;
- M[24*i + 15] = 0;
- M[24*i + 16] = -CalCtrlPts.at(i).x/A;
- M[24*i + 17] = -CalCtrlPts.at(i).y/A;
- M[24*i + 18] = -CalCtrlPts.at(i).z/A;
- M[24*i + 19] = -1/A;
- M[24*i + 20] = -PixContner.at(i).y * CalCtrlPts.at(i).x/A;
- M[24*i + 21] = -PixContner.at(i).y * CalCtrlPts.at(i).y/A;
- M[24*i + 22] = -PixContner.at(i).y * CalCtrlPts.at(i).z/A;
- M[24*i + 23] = -(PixContner.at(i).y - y0)*r2;
- W[2*i + 0] = PixContner.at(i).x/A;
- W[2*i + 1] = PixContner.at(i).y/A;
- }
- //解求pL
- transpose(M,Mt,nCalPtsNum*2,12);
- mult(Mt,M,MtM,12,nCalPtsNum*2,12);
- inv(MtM,12);
- mult(Mt,W,MtW,12,nCalPtsNum*2,1);
- mult(MtM,MtW,pL,12,12,1);
- //求fx--pElems【2】作为迭代结束的标志
- xoyofenmu = pL[8]*pL[8] + pL[9]*pL[9] + pL[10]*pL[10];
- x0 = -(pL[0]*pL[8] + pL[1]*pL[9] + pL[2]*pL[10])/xoyofenmu;
- y0 = -(pL[4]*pL[8] + pL[5]*pL[9] + pL[6]*pL[10])/xoyofenmu;
- r32 = 1/xoyofenmu;
- A = r32*(pL[0]*pL[0] + pL[1]*pL[1] + pL[2]*pL[2]) - x0*x0;
- B = r32*(pL[4]*pL[4] + pL[5]*pL[5] + pL[6]*pL[6]) - y0*y0;
- C = r32*(pL[0]*pL[4] + pL[1]*pL[5] + pL[2]*pL[6]) - x0*y0;
- pElems[4] = asin( sqrt( C*C/(A*B) ) );//dB
- fx = sqrt(A)*cos(pElems[4]) ;
- if(nIterationCnt == 1)//第一次运算时pElems[2]无值
- {
- pElems[2] = fx;
- continue;
- }
- if (fabs(fx - pElems[2])<0.001)
- {
- bFlag = false;
- break;
- }
- pElems[2] = fx;
- }
- //计算结果
- //返回Li系数
- for (i=0;i<12;i++)
- {
- pTrueLi[i] = pL[i];
- }
- //返回11个内外方位元素参数和变形参数
- //x0,y0,fx,ds,dB,Xs,Ys,Zs,t(phi),w,k
- pElems[0] = x0;//
- pElems[1] = y0;//
- pElems[2] = fx;//
- pElems[3] = sqrt(A/B) -1;//ds
- //pElems[4] = ;//dB迭代中已求
- //先求角元素
- double a3,b3,c3,b1,b2;
- a3 = pL[8]/sqrt(xoyofenmu);
- b3 = pL[9]/sqrt(xoyofenmu);
- c3 = pL[10]/sqrt(xoyofenmu);
- b2 = (pL[5]*sqrt(r32) + b3*y0)*(1+pElems[3])*cos(pElems[4])/fx;
- b1 = (pElems[1]*sqrt(r32) + b2*fx*tan(pElems[4]) + b3*x0 )/fx ;
- pElems[8] = atan(-a3/c3);//t(phi)
- pElems[9] = asin(-b3);//w
- pElems[10] = atan(b1/b2);//k
- //再求线元素
- M[0] = pL [0] ;
- M[1] = pL [1] ;
- M[2] = pL [2] ;
- M[3] = pL [4] ;
- M[4] = pL [5] ;
- M[5] = pL [6] ;
- M[6] = pL [8] ;
- M[7] = pL [9] ;
- M[8] = pL [10] ;
- W[0] = -pL [3];
- W[1] = -pL [7];
- W[2] = -1;
- inv(M,3);
- mult(M,W,Mt,3,3,1);
- pElems[5] = Mt[0];//Xs
- pElems[6] = Mt[1];//
- pElems[7] = Mt[2];//
- //释放临时内存空间
- delete [] pL;
- delete [] M;
- delete [] Mt;
- delete [] MtM;
- delete [] MtW;
- CalCtrlPts.clear();
- PixContner.clear();
- return nIterationCnt;
- }
- void CDLTDlg::CalXYZAndPrecision(vector<PixPoint> LPixContner,vector<PixPoint> RPixContner,double *pLLinar,double *pRLinar,double *pLi1,double *pLi2)
- {
- //搜索同名像点并进行非线性误差改正
- vector<PRSPoint> CalCtrlPts;
- for (int i =0;i<LPixContner.size();i++)
- {
- for(int j = 0;j<RPixContner.size();j++)
- {
- if (LPixContner.at(i).ID == RPixContner.at(j).ID)
- {
- PRSPoint point;
- double r21,r22;
- //进行线性误差改正
- r21 = pow(LPixContner.at(i).x - pLLinar[0],2) + pow(LPixContner.at(i).y - pLLinar[1],2);
- r22 = pow(RPixContner.at(j).x - pRLinar[0],2) + pow(RPixContner.at(j).y - pRLinar[1],2);
- point.ID = LPixContner.at(i).ID;
- point.x1 = LPixContner.at(i).x + pLi1[11]*(LPixContner.at(i).x - pLLinar[0])*r21;
- point.y1 = LPixContner.at(i).y + pLi1[11]*(LPixContner.at(i).y - pLLinar[1])*r21;
- point.x2 = RPixContner.at(j).x + pLi2[11]*(RPixContner.at(j).x - pRLinar[0])*r22;
- point.y2 = RPixContner.at(j).y + pLi2[11]*(RPixContner.at(j).y - pRLinar[1])*r22;
- ///计算X,Y,Z的初值
- double * A = new double [12];
- double * L = new double [4];
- double * X = new double [4];
- A[0] = pLi1[0] + LPixContner.at(i).x*pLi1[8];
- A[1] = pLi1[1] + LPixContner.at(i).x*pLi1[9];
- A[2] = pLi1[2] + LPixContner.at(i).x*pLi1[10];
- A[3] = pLi1[4] + LPixContner.at(i).y*pLi1[10];
- A[4] = pLi1[5] + LPixContner.at(i).y*pLi1[10];
- A[5] = pLi1[6] + LPixContner.at(i).y*pLi1[10];
- A[6] = pLi2[0] + RPixContner.at(j).x*pLi2[8];
- A[7] = pLi2[1] + RPixContner.at(j).x*pLi2[9];
- A[8] = pLi2[2] + RPixContner.at(j).x*pLi2[10];
- L[0] = -pLi1[3] - LPixContner.at(i).x;
- L[1] = -pLi1[7] - LPixContner.at(i).y;
- L[2] = -pLi2[3] - RPixContner.at(j).x;
- inv(A,3);
- mult(A,L,X,3,3,1);
- point.X = X[0];
- point.Y = X[1];
- point.Z = X[2];
- CalCtrlPts.push_back(point);
- delete [] A;
- delete [] L;
- delete [] X;
- break;
- }
- }
- }
- int nCalPtsNum = CalCtrlPts.size();
- if(nCalPtsNum < 1) return;
- double * N = new double [4 * 3];
- double * Nt = new double [4 * 3];
- double * NtN = new double [3*3];
- double * Q = new double [4];
- double * NtQ = new double [3];
- double * SS = new double [3];
- double * NSS = new double [4];
- double * V = new double [4];
- double * Vt = new double [4];
- double VtV,A1 ,A2;
- //逐点循环迭代求解并输出结果
- FILE * fp;
- fp = fopen(strResultFileName,"a+");
- fprintf(fp,"以下为同名点的大地坐标和精度n 点号 X Y Z 精度n");
- for (i=0;i<nCalPtsNum;i++)
- {
- //初始化参数
- int bFlag = 3,nCount=0;
- double X[3] = {CalCtrlPts.at(i).X, CalCtrlPts.at(i).Y,CalCtrlPts.at(i).Z};//保存计算结果用于比较
- while(bFlag)
- {
- bFlag = 3;
- nCount++;
- if (nCount == 11)
- {
- //CalCtrlPts.at(i).ID = -999;
- break;
- }
- A1 = pLi1[8]*CalCtrlPts.at(i).X + pLi1[9]*CalCtrlPts.at(i).Y + pLi1[10]*CalCtrlPts.at(i).Z + 1;
- A2 = pLi2[8]*CalCtrlPts.at(i).X + pLi2[9]*CalCtrlPts.at(i).Y + pLi2[10]*CalCtrlPts.at(i).Z + 1;
- N[0] = -(pLi1[0] + pLi1[8]*CalCtrlPts.at(i).x1)/A1;
- N[1] = -(pLi1[1] + pLi1[9]*CalCtrlPts.at(i).x1)/A1;
- N[2] = -(pLi1[2] + pLi1[10]*CalCtrlPts.at(i).x1)/A1;
- N[3] = -(pLi1[4] + pLi1[8]*CalCtrlPts.at(i).y1)/A1;
- N[4] = -(pLi1[5] + pLi1[9]*CalCtrlPts.at(i).y1)/A1;
- N[5] = -(pLi1[6] + pLi1[10]*CalCtrlPts.at(i).y1)/A1;
- N[6] = -(pLi2[0] + pLi2[8]*CalCtrlPts.at(i).x2)/A2;
- N[7] = -(pLi2[1] + pLi2[9]*CalCtrlPts.at(i).x2)/A2;
- N[8] = -(pLi2[2] + pLi2[10]*CalCtrlPts.at(i).x2)/A2;
- N[9] = -(pLi2[4] + pLi2[8]*CalCtrlPts.at(i).y2)/A2;
- N[10] = -(pLi2[5] + pLi2[9]*CalCtrlPts.at(i).y2)/A2;
- N[11] = -(pLi2[6] + pLi2[10]*CalCtrlPts.at(i).y2)/A2;
- Q[0] = (pLi1[3] + CalCtrlPts.at(i).x1)/A1;
- Q[1] = (pLi1[7] + CalCtrlPts.at(i).y1)/A1;
- Q[2] = (pLi2[3] + CalCtrlPts.at(i).x2)/A2;
- Q[3] = (pLi2[7] + CalCtrlPts.at(i).y2)/A2;
- //计算结果
- transpose(N,Nt,4,3);
- mult(Nt,N,NtN,3,4,3);
- mult(Nt,Q,NtQ,3,4,1);
- inv(NtN,3);
- mult(NtN,NtQ,SS,3,3,1);
- for (int j=0;j<3;j++)
- {
- if (fabs(SS[j]-X[j])<0.001)
- bFlag --;
- X[j] = SS[j];//保存上一次计算结果,用比较
- }
- //保存结果
- CalCtrlPts.at(i).X = SS[0];
- CalCtrlPts.at(i).Y = SS[1];
- CalCtrlPts.at(i).Z = SS[2];
- }
- //计算中误差
- mult(N,SS,NSS,4,3,1);
- for (int j=0;j<4;j++)//计算NS + Q
- {
- V[j] = NSS[j] - Q[j];
- }
- transpose(V,Vt,4,1);
- mult(Vt,V,&VtV,1,4,1);
- CalCtrlPts.at(i).m = VtV;
- //output
- if (nCount == 11)
- fprintf(fp,"%d %.6f %.6f %.6f %.6f 迭代次数达10次,计算终止n",
- CalCtrlPts.at(i).ID,CalCtrlPts.at(i).X,CalCtrlPts.at(i).Y,CalCtrlPts.at(i).Z,CalCtrlPts.at(i).m);
- else
- fprintf(fp,"%d %.6f %.6f %.6f %.6fn",
- CalCtrlPts.at(i).ID,CalCtrlPts.at(i).X,CalCtrlPts.at(i).Y,CalCtrlPts.at(i).Z,CalCtrlPts.at(i).m);
- }
- fclose(fp);
- //释放临时内存空间
- delete [] N;
- delete [] Nt;
- delete [] NtN;
- delete [] Q;
- delete [] NtQ;
- delete [] SS;
- delete [] NSS;
- delete [] V;
- delete [] Vt;
- CalCtrlPts.clear();
- }