📄 cspacedlg.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 + -