📄 dlgrt.cpp
字号:
// DlgRT.cpp : implementation file
//
#include "stdafx.h"
#include "RT.h"
#include "DlgRT.h"
#include "Matrix.h"
#include "Complex.h"
#include "PandL.h"
#include<stdio.h>
#include<iostream.h>
#include<fstream.h>
#include<stdlib.h>
#include<iomanip.h>
#include<cstring>
#include<string.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDlgRT dialog
CDlgRT::CDlgRT(CWnd* pParent /*=NULL*/)
: CDialog(CDlgRT::IDD, pParent)
{
//{{AFX_DATA_INIT(CDlgRT)
m_x1 = 19.4474;
m_x2 = 19.4474;
m_x3 = 18.4776;
m_y1 = 85.6761;
m_y2 = 88.3985;
m_y3 = 87.2318;
m_z1 = 4.6689;
m_z2 = 4.6689;
m_z3 = 7.6537;
m_xc1 = 14.507;
m_xc2 = 14.507;
m_xc3 = 12.1748;
m_yc1 = 85.6761;
m_yc2 = 88.3985;
m_yc3 = 87.2318;
m_zc1 = 13.767 ;
m_zc2 = 13.767 ;
m_zc3 = 15.8669 ;
//}}AFX_DATA_INIT
}
void CDlgRT::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDlgRT)
DDX_Text(pDX, IDC_EDITx1, m_x1);
DDX_Text(pDX, IDC_EDITx2, m_x2);
DDX_Text(pDX, IDC_EDITy1, m_y1);
DDX_Text(pDX, IDC_EDITy2, m_y2);
DDX_Text(pDX, IDC_EDITz1, m_z1);
DDX_Text(pDX, IDC_EDITz2, m_z2);
DDX_Text(pDX, IDC_EDITx3, m_x3);
DDX_Text(pDX, IDC_EDITy3, m_y3);
DDX_Text(pDX, IDC_EDITz3, m_z3);
DDX_Text(pDX, IDC_EDITxc1, m_xc1);
DDX_Text(pDX, IDC_EDITxc2, m_xc2);
DDX_Text(pDX, IDC_EDITxc3, m_xc3);
DDX_Text(pDX, IDC_EDITyc1, m_yc1);
DDX_Text(pDX, IDC_EDITyc2, m_yc2);
DDX_Text(pDX, IDC_EDITyc3, m_yc3);
DDX_Text(pDX, IDC_EDITzc1, m_zc1);
DDX_Text(pDX, IDC_EDITzc2, m_zc2);
DDX_Text(pDX, IDC_EDITzc3, m_zc3);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDlgRT, CDialog)
//{{AFX_MSG_MAP(CDlgRT)
ON_BN_CLICKED(IDC_BUT_RT, OnButRt)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDlgRT message handlers
void CDlgRT::OnButRt()
{
// TODO: Add your control notification handler code here
// double p1[3]={0,2,5},p2[3]={2,4,2},p3[3]={4,6,9};//p1,p2,p3点坐标
// double q1[3]={10,13,17},q2[3]={14,19,25},q3[3]={22,21,35};//q1,q2,q3点坐标
UpdateData();
double p1[3],p2[3],p3[3];
p1[0]=m_x1;p1[1]=m_y1;p1[2]=m_z1;
p2[0]=m_x2;p2[1]=m_y2;p2[2]=m_z2;
p3[0]=m_x3;p3[1]=m_y3;p3[2]=m_z3;
double q1[3],q2[3],q3[3];
q1[0]=m_xc1;q1[1]=m_yc1;q1[2]=m_zc1;
q2[0]=m_xc2;q2[1]=m_yc2;q2[2]=m_zc2;
q3[0]=m_xc3;q3[1]=m_yc3;q3[2]=m_zc3;
double v1[3],v2[3],v3[3];//矢量
double w1[3],w2[3],w3[3];//矢量
double temp_p31[3],temp_q31[3];//矢量
double v01,v02,v03;
double w01,w02,w03;
for (int i=0;i<3;i++)
{
v1[i]=0.0;v2[i]=0.0;v3[i]=0.0;
w1[i]=0.0;w2[i]=0.0;w3[i]=0.0;
temp_p31[i]=0.0;temp_q31[i]=0.0;
}
v01=v02=v03=0.0;
w01=w02=w03=0.0;//初始化
for(int j=0;j<3;j++)
{
v1[j]=p2[j]-p1[j];
w1[j]=q2[j]-q1[j];
temp_p31[j]=p3[j]-p1[j];
temp_q31[j]=q3[j]-q1[j];
}
v3[0]=v1[1]*temp_p31[2]-temp_p31[1]*v1[2];
v3[1]=v1[2]*temp_p31[0]-temp_p31[2]*v1[0];
v3[2]=v1[0]*temp_p31[1]-temp_p31[0]*v1[1];//v1 X temp_p31 得到矢量V3
w3[0]=w1[1]*temp_q31[2]-temp_q31[1]*w1[2];
w3[1]=w1[2]*temp_q31[0]-temp_q31[2]*w1[0];
w3[2]=w1[0]*temp_q31[1]-temp_q31[0]*w1[1];//w1 X temp_q31 得到矢量W3
v2[0]=v3[1]*v1[2]-v1[1]*v3[2];
v2[1]=v3[2]*v1[0]-v1[2]*v3[0];
v2[2]=v3[0]*v1[1]-v1[0]*v3[1];//得到矢量v2
w2[0]=w3[1]*w1[2]-w1[1]*w3[2];
w2[1]=w3[2]*w1[0]-w1[2]*w3[0];
w2[2]=w3[0]*w1[1]-w1[0]*w3[1];//得到矢量w2
v01=sqrt(v1[0]*v1[0]+v1[1]*v1[1]+v1[2]*v1[2]);
v02=sqrt(v2[0]*v2[0]+v2[1]*v2[1]+v2[2]*v2[2]);
v03=sqrt(v3[0]*v3[0]+v3[1]*v3[1]+v3[2]*v3[2]);
w01=sqrt(w1[0]*w1[0]+w1[1]*w1[1]+w1[2]*w1[2]);
w02=sqrt(w2[0]*w2[0]+w2[1]*w2[1]+w2[2]*w2[2]);
w03=sqrt(w3[0]*w3[0]+w3[1]*w3[1]+w3[2]*w3[2]);
for (int k=0;k<3;k++)
{
v1[k]=v1[k]/v01;v2[k]=v2[k]/v02;v3[k]=v3[k]/v03;
w1[k]=w1[k]/w01;w2[k]=w2[k]/w02;w3[k]=w3[k]/w03;
}//单位化
double dmvc[9];
dmvc[0]=v1[0];dmvc[1]=v1[1];dmvc[2]=v1[2];
dmvc[3]=v2[0];dmvc[4]=v2[1];dmvc[5]=v2[2];
dmvc[6]=v3[0];dmvc[7]=v3[1];dmvc[8]=v3[2];
double dmwc[9];
dmwc[0]=w1[0];dmwc[1]=w1[1];dmwc[2]=w1[2];
dmwc[3]=w2[0];dmwc[4]=w2[1];dmwc[5]=w2[2];
dmwc[6]=w3[0];dmwc[7]=w3[1];dmwc[8]=w3[2];
// 构造矩阵
CMatrix mtxA(3,dmvc);
CMatrix mtxB(3,dmwc);
CMatrix mtxR(3);
CMatrix mtxP(1,3,p1);
CMatrix mtxQ(1,3,q1);
CMatrix mtxT(1,3);
// 实矩阵求逆的全选主元高斯-约当法
if (mtxA.InvertGaussJordan())
{
mtxR=mtxA*mtxB;
mtxT=mtxQ-mtxP*mtxR;
m_strMatrix1 = mtxR.ToString(" ");
m_strMatrix2 = mtxT.ToString(" ");
}
else
{
m_strMatrix1 = "求解转换矩阵失败";
AfxMessageBox(m_strMatrix1, MB_OK|MB_ICONINFORMATION);
return;
}
AfxMessageBox(m_strMatrix1, MB_OK|MB_ICONINFORMATION);
AfxMessageBox(m_strMatrix2, MB_OK|MB_ICONINFORMATION);
CFileDialog dlg(TRUE,"txt",NULL,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
"txt File(*.txt)|*.txt", NULL );
if(dlg.DoModal()==IDOK){
CALine* Line = new CALine();
CString strName = dlg.GetPathName();
Line->LoadTXTFile(strName);
if(Line->IsEmpty())
delete Line;
double rt[3];
for(int t=0;t<3;t++)
rt[t]=0;
CMatrix *CMrt=NULL;
CMatrix CMtemp(1,3,rt);
for( int i1=0;i1<Line->m_LineList2.GetSize();i1++) //数组m[i][j]初始化
{
for( int j1=0;j1<Line->m_LineList2[i1]->m_PointList2.GetSize();j1++)
{
CMrt=new CMatrix(1,3);
rt[0]=Line->m_LineList2[i1]->m_PointList2[j1]->pt3.x;
rt[1]=Line->m_LineList2[i1]->m_PointList2[j1]->pt3.y;
rt[2]=Line->m_LineList2[i1]->m_PointList2[j1]->pt3.z;
CMrt->SetData(rt);
CMtemp=*CMrt*mtxR+mtxT;
rt[0]=(CMtemp.GetData())[0];
rt[1]=(CMtemp.GetData())[1];
rt[2]=(CMtemp.GetData())[2];
Line->m_LineList2[i1]->m_PointList2[j1]->pt3.x=rt[0];
Line->m_LineList2[i1]->m_PointList2[j1]->pt3.y=rt[1];
Line->m_LineList2[i1]->m_PointList2[j1]->pt3.z=rt[2];
}
}
char save[200]="";
CFileDialog dlg(FALSE,"txt",NULL,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
"txt File(*.txt)|*.txt", NULL );
if(dlg.DoModal()==IDOK){
CString strSaveName= dlg.GetPathName();
strcat( save, strSaveName);
}
ofstream outstuf; //建立输出文件流对象
outstuf.open(save,ios::out); //连接文件,指定打开方式
int NumberOfPoint=0;
for( int i0=0;i0<Line->m_LineList2.GetSize();i0++) //数组m[i][j]初始化
{
NumberOfPoint=NumberOfPoint+Line->m_LineList2[i0]->m_PointList2.GetSize();
}
outstuf <<"total number of line:"<<Line->m_LineList2.GetSize()<<" "<<"total number of point:"<<NumberOfPoint<<endl;
for( int i=0;i<Line->m_LineList2.GetSize();i++) //数组m[i][j]初始化
{
// outstuf<<"-----------------------------------------------------"<<endl;
outstuf <<"line"<<" "<<i+1<<" "<<"point"<<" "<<Line->m_LineList2[i]->m_PointList2.GetSize()<<endl;
for( int j=0;j<Line->m_LineList2[i]->m_PointList2.GetSize();j++)
{
outstuf <<Line->m_LineList2[i]->m_PointList2[j]->pt3.x <<" "<<Line->m_LineList2[i]->m_PointList2[j]->pt3.y<<" "<<Line->m_LineList2[i]->m_PointList2[j]->pt3.z<<"\n";
}
}
outstuf.close();
}
}
/*void CDlgRT::OnChangeout()
{
// TODO: Add your control notification handler code here
CFileDialog dlg(TRUE,"txt",NULL,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
"txt File(*.txt)|*.txt", NULL );
if(dlg.DoModal()==IDOK){
CALine* Line = new CALine();
CString strName = dlg.GetPathName();
Line->LoadTXTFile(strName);
if(Line->IsEmpty())
delete Line;
ofstream outstuf; //建立输出文件流对象
outstuf.open("e:\\1111",ios::out); //连接文件,指定打开方式
int NumberOfPoint=0;
for( int i0=0;i0<Line->m_LineList2.GetSize();i0++) //数组m[i][j]初始化
{
NumberOfPoint=NumberOfPoint+Line->m_LineList2[i0]->m_PointList2.GetSize();
}
outstuf <<"the number of line:"<<Line->m_LineList2.GetSize()<<" "<<"the number of point:"<<NumberOfPoint<<endl;
for( int i=0;i<Line->m_LineList2.GetSize();i++) //数组m[i][j]初始化
{
outstuf<<"-----------------------------------------------------"<<endl;
outstuf <<"line:"<<i+1<<" "<<"point:"<<Line->m_LineList2[i]->m_PointList2.GetSize()<<endl;
for( int j=0;j<Line->m_LineList2[i]->m_PointList2.GetSize();j++)
{
outstuf <<Line->m_LineList2[i]->m_PointList2[j]->pt3.x <<" "<<Line->m_LineList2[i]->m_PointList2[j]->pt3.y<<" "<<Line->m_LineList2[i]->m_PointList2[j]->pt3.z<<"\n";
}
}
outstuf.close();
}
}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -