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

📄 cspacedlg.cpp

📁 大地测量专业计算软件
💻 CPP
字号:
// CSpaceDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "CoorTrans.h"
#include "CSpaceDlg.h"



// CCSpaceDlg 对话框

IMPLEMENT_DYNAMIC(CCSpaceDlg, CDialog)

CCSpaceDlg::CCSpaceDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CCSpaceDlg::IDD, pParent)
{
	statusNew=FALSE;             
	statusOld=FALSE;

}

CCSpaceDlg::~CCSpaceDlg()
{
}

void CCSpaceDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	
}


BEGIN_MESSAGE_MAP(CCSpaceDlg, CDialog)
	ON_BN_CLICKED(IDC_BUTTON_GETNEW, &CCSpaceDlg::OnBnClickedButtonGetnew)
	ON_BN_CLICKED(IDC_BUTTON_GETOLD, &CCSpaceDlg::OnBnClickedButtonGetold)
	ON_BN_CLICKED(IDC_BUTTON_CAL7, &CCSpaceDlg::OnBnClickedButtonCal7)

END_MESSAGE_MAP()


// CCSpaceDlg 消息处理程序

void CCSpaceDlg::OnBnClickedButtonGetnew()					//按下导入数据(新)的响应函数
{
	statusNew=p_New.ReadFromFile("pNew.txt");				//读入数据并将状态赋给statusNew
	
	if(statusNew)											//判断是否读入成果
		MessageBox("读取成功!");
	else
		MessageBox("读取失败!");
}

void CCSpaceDlg::OnBnClickedButtonGetold()					//按下导入数据(旧)的响应函数
{
	statusOld=p_Old.ReadFromFile("pOld.txt");
	
	if(statusOld)
		MessageBox("读取成功!");
	else
		MessageBox("读取失败!");
}

void CCSpaceDlg::OnBnClickedButtonCal7()					//按下计算七参数的响应函数
{
	
	if (statusNew&statusOld)								//判断是否读入了数据
	{
		CreateB();
		CreateL();
		LeastCal();
		GtRes();

		CString str0;										//显示结果在编辑框内
		str0.Format("%.6f",m);
		CString str1;
		str1.Format("%.6f",dX0);
		CString str2;
		str2.Format("%.6f",dY0);
		CString str3;
		str3.Format("%.6f",dZ0);
		CString str4;
		str4.Format("%.6f",eX);
		CString str5;
		str5.Format("%.6f",eY);
		CString str6;
		str6.Format("%.6f",eZ);

		CString out;
		out="m:"+str0+"\r\nΔX0: "+str1+"\r\nΔY0: "+str2+"\r\nΔZ0: "+str3+"\r\nεX: "+str4+ "\r\nεY: "+str5+"\r\nεZ: "+str6;



		GetDlgItem(IDC_EDIT_SHOW)->SetWindowText(out);
	} 
	else
	{
		MessageBox("请先读取数据!");
	}
	
		// TODO: 在此添加控件通知处理程序代码
	

}


void CCSpaceDlg::CreateB()								//创建B矩阵
{
	double X1,Y1,Z1;									
	p1=p_Old;
	ptNum=p1.GetNrRows();								//计算点的个数(n行代表n个点)

	Matrix B(ptNum*3,7);								//初始化B的规模
	for (int i=1;i<=ptNum;i++)							//循环为B赋值
	{

		X1=p1[i-1][1];
		Y1=p1[i-1][2];
		Z1=p1[i-1][3];

		

		B(3*i-3,0)=1;
		B(3*i-3,1)=0;
		B(3*i-3,2)=0;
		B(3*i-3,3)=X1;
		B(3*i-3,4)=0;
		B(3*i-3,5)=-Z1;
		B(3*i-3,6)=Y1;

		B(3*i-2,0)=0;
		B(3*i-2,1)=1;
		B(3*i-2,2)=0;
		B(3*i-2,3)=Y1;
		B(3*i-2,4)=Z1;
		B(3*i-2,5)=0;
		B(3*i-2,6)=-X1;


		B(3*i-1,0)=0;
		B(3*i-1,1)=0;
		B(3*i-1,2)=1;
		B(3*i-1,3)=Z1;
		B(3*i-1,4)=-Y1;
		B(3*i-1,5)=X1;
		B(3*i-1,6)=0;

	}
	
	Bcl=B*(-1);											//在类中声明的Bcl由于不知点的个数,
														//是不能初始化的只能声明个局部变量B
														//再把B赋值给Bcl
}

void CCSpaceDlg::CreateL()								//创建l矩阵
{
	double X2,Y2,Z2;
	p2=p_New;

	Matrix l(3*ptNum,1);

	for (int i=1;i<=ptNum;i++)
	{

		X2=p2[i-1][1];
		Y2=p2[i-1][2];
		Z2=p2[i-1][3];

		
		l(3*i-3,0)=X2;
		l(3*i-2,0)=Y2;
		l(3*i-1,0)=Z2;

	}
	
	lcl=l;
}

void CCSpaceDlg::LeastCal()
{	//if ()
	//{
	//}
	Res=-1*((Bcl.T()*Bcl).Inv()*Bcl.T()*lcl);			//求最小二乘解
}

void CCSpaceDlg::GtRes()								//得到结果
{
	dX0=Res[0];
	dY0=Res[1];
	dZ0=Res[2];
	a1=Res[3];
	a2=Res[4];
	a3=Res[5];
	a4=Res[6];

	m=a1-1;
	eX=a2/a1;
	eY=a3/a1;
	eZ=a4/a1;

}

⌨️ 快捷键说明

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