📄 myclass.cpp
字号:
//MyClass.cpp:implementation of the CMyClass class.
#include "stdafx.h"
#include "Tran3D.h"
#include "MyClass.h"
#include "Tran3DView.h"
#include "math.h"
#define PI 3.141592654
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//Constrauction/Destruction
CMyClass::CMyClass()
{
}
CMyClass::~CMyClass()
{
}
void CMyClass::ReadWorkpiece()
{
X[1]=0; Y[1]=0; Z[1]=0; C[1]=1;
X[2]=45; Y[2]=0; Z[2]=0; C[2]=1;
X[3]=45; Y[3]=37; Z[3]=0; C[3]=1;
X[4]=0 ; Y[4]=37; Z[4]=0; C[4]=1;
X[5]=0 ; Y[5]=37; Z[5]=45; C[5]=1;
X[6]=0 ; Y[6]=0 ; Z[6]=45; C[6]=1;
X[7]=12 ; Y[7]=0 ; Z[7]=45; C[7]=1;
X[8]=30 ; Y[8]=0 ; Z[8]=14; C[8]=1;
X[9]=45 ; Y[9]=0 ; Z[9]=14; C[9]=1;
X[10]=45 ; Y[10]=37 ; Z[10]=14; C[10]=1;
X[11]=30 ; Y[11]=37 ; Z[11]=14; C[11]=1;
X[12]=12 ; Y[12]=37 ; Z[12]=45; C[12]=1;
X[13]=12 ; Y[13]=21 ; Z[13]=45; C[13]=1;
X[14]=22 ; Y[14]=31 ; Z[14]=27; C[14]=1;
X[15]=30 ; Y[15]=24 ; Z[15]=14; C[15]=1;
X[16]=36 ; Y[16]=19 ; Z[16]=14; C[16]=1;
X[17]=30 ; Y[17]=13 ; Z[17]=14; C[17]=1;
X[18]=22 ; Y[18]=6 ; Z[18]=27; C[18]=1;
X[19]=12 ; Y[19]=16 ; Z[19]=45; C[19]=1;
X[20]=22 ; Y[20]=6 ; Z[20]=45; C[20]=1;
X[21]=36 ; Y[21]=19 ; Z[21]=45; C[21]=1;
X[21]=22 ; Y[21]=31 ; Z[21]=45; C[21]=1;
}
/*************************************************
次函数分别用于三个试图的投影变换,统一用变换后定点的三个坐标计算公式求其坐标值。
这三个公式是由点的齐次坐标诚意变换矩阵得来的。实际上每个视图投影只有二个非零坐标需要计算求得,
而另一个坐标是零勿需计算。因此也可以根据三个不同视图的投影,分别采用其投影后的二个坐标计算式
来求坐标值。函数中可用条件语句选择不同视图投影采用不同坐标计算公式求值。
************************************************/
void CMyClass::Calculate(array2d B)
{
ReadWorkpiece();
for(int i=1;i<=22;i++)
{
XT[i]=3*X[i]*B[1][1]+3*Y[i]*B[2][1]+3*Z[i]*B[3][1]+C[i]*B[4][1];
YT[i]=3*X[i]*B[1][2]+3*Y[i]*B[2][2]+3*Z[i]*B[3][2]+C[i]*B[4][2];
ZT[i]=3*X[i]*B[1][3]+3*Y[i]*B[2][3]+3*Z[i]*B[3][3]+C[i]*B[4][3];
}
}
//次函数求轴测投影后的坐标值
void CMyClass::MCalculate(array2d B)
{
ReadWorkpiece();
for(int i=1;i<=22;++i)
{
XT[i]=3*X[i]*B[1][1]+3*Y[i]*B[2][1]+3*Z[i]*B[3][1]+C[i]*B[4][1];
YT[i]=3*X[i]*B[1][2]+3*Y[i]*B[2][2]+3*Z[i]*B[3][2]+C[i]*B[4][2];
ZT[i]=3*X[i]*B[1][3]+3*Y[i]*B[2][3]+3*Z[i]*B[3][3]+C[i]*B[4][3];
}
//三个坐标计算公式由点的齐次坐标乘以轴测投影变换矩阵得来。
}
//把主视图、俯视图、侧视图都绘制在同一画面上
void CMyClass::DrawTriview()
{
CFrameWnd* pWnd=(CFrameWnd*)AfxGetApp()->m_pMainWnd;
CDC* pdc=pWnd->GetActiveView()->GetDC();
CRect rr;
::GetClientRect(pWnd->GetActiveView()->m_hWnd,rr);
DrawText();
DrawViewV(pdc,rr);
DrawViewH(pdc,rr);
DrawViewW(pdc,rr);
pWnd->GetActiveView()->ReleaseDC(pdc);
}
//绘制主视图
void CMyClass::DrawViewV(CDC* pdc,CRect rr)
{
xx=rr.right/2;
yy=rr.bottom/2;
Calculate(A);//作主视图的投影变换
moveto(xx-XT[1],yy-ZT[1],pdc);
for(int i=2;i<22;++i)//画出主视图
lineto(xx-XT[i],yy-ZT[i],pdc);
moveto(xx-XT[1],yy-ZT[1],pdc);
lineto(xx-XT[4],yy-ZT[4],pdc);
moveto(xx-XT[1],yy-ZT[1],pdc);
lineto(xx-XT[6],yy-ZT[6],pdc);
moveto(xx-XT[7],yy-ZT[7],pdc);
lineto(xx-XT[19],yy-ZT[19],pdc);
moveto(xx-XT[13],yy-ZT[13],pdc);
lineto(xx-XT[22],yy-ZT[22],pdc);
moveto(xx-XT[3],yy-ZT[3],pdc);
lineto(xx-XT[10],yy-ZT[10],pdc);
moveto(xx-XT[2],yy-ZT[2],pdc);
lineto(xx-XT[9],yy-ZT[9],pdc);
moveto(xx-XT[12],yy-ZT[12],pdc);
lineto(xx-XT[5],yy-ZT[5],pdc);
moveto(xx-XT[14],yy-ZT[14],pdc);
lineto(xx-XT[22],yy-ZT[22],pdc);
moveto(xx-XT[16],yy-ZT[16],pdc);
lineto(xx-XT[21],yy-ZT[21],pdc);
moveto(xx-XT[18],yy-ZT[18],pdc);
lineto(xx-XT[20],yy-ZT[20],pdc);
moveto(xx-XT[11],yy-ZT[11],pdc);
lineto(xx-XT[15],yy-ZT[15],pdc);
moveto(xx-XT[8],yy-ZT[8],pdc);
lineto(xx-XT[17],yy-ZT[17],pdc);
}
//定义自己的定点函数,(x,y)为所要的点
void CMyClass::moveto(double x,double y,CDC *pdc)
{
pdc->MoveTo((int)x,(int)y);
}
//定义自己的画线函数,由当前点画至(x,y)处
void CMyClass::lineto(double x,double y,CDC* pdc)
{
pdc->LineTo((int)x,(int)y);
}
//绘制俯视图
void CMyClass::DrawViewH(CDC* pdc,CRect rr)
{
xx=rr.right/2;
yy=rr.bottom/2;
Calculate(Ah);//作俯视图的投影变换
moveto(xx-XT[1],yy+ZT[1],pdc);
for(int i=2; i<=22;++i)//画出俯视图
lineto(xx-XT[i],yy+ZT[i],pdc);
moveto(xx-XT[1],yy+ZT[1],pdc);
lineto(xx-XT[4],yy+ZT[4],pdc);
moveto(xx-XT[1],yy+ZT[1],pdc);
lineto(xx-XT[6],yy+ZT[6],pdc);
moveto(xx-XT[7],yy+ZT[7],pdc);
lineto(xx-XT[19],yy+ZT[19],pdc);
moveto(xx-XT[13],yy+ZT[13],pdc);
lineto(xx-XT[22],yy+ZT[22],pdc);
moveto(xx-XT[3],yy+ZT[3],pdc);
lineto(xx-XT[10],yy+ZT[10],pdc);
moveto(xx-XT[2],yy+ZT[2],pdc);
lineto(xx-XT[9],yy+ZT[9],pdc);
moveto(xx-XT[12],yy+ZT[12],pdc);
lineto(xx-XT[5],yy+ZT[5],pdc);
moveto(xx-XT[14],yy+ZT[14],pdc);
lineto(xx-XT[22],yy+ZT[22],pdc);
moveto(xx-XT[16],yy+ZT[16],pdc);
lineto(xx-XT[21],yy+ZT[21],pdc);
moveto(xx-XT[18],yy+ZT[18],pdc);
lineto(xx-XT[20],yy+ZT[20],pdc);
moveto(xx-XT[11],yy+ZT[11],pdc);
lineto(xx-XT[15],yy+ZT[15],pdc);
moveto(xx-XT[8],yy+ZT[8],pdc);
lineto(xx-XT[17],yy+ZT[17],pdc);
}
//绘制侧视图
void CMyClass::DrawViewW(CDC* pdc,CRect rr)
{
xx=rr.right/2;
yy=rr.bottom/2;
Calculate(Ah);//作ce视图的投影变换
moveto(xx+XT[1],yy-ZT[1],pdc);
for(int i=2; i<=22;++i)
//画侧视图
lineto(xx+XT[i],yy-ZT[i],pdc);
moveto(xx+XT[1],yy-ZT[1],pdc);
lineto(xx+XT[4],yy-ZT[4],pdc);
moveto(xx+XT[1],yy-ZT[1],pdc);
lineto(xx+XT[6],yy-ZT[6],pdc);
moveto(xx+XT[7],yy-ZT[7],pdc);
lineto(xx+XT[19],yy-ZT[19],pdc);
moveto(xx+XT[13],yy-ZT[13],pdc);
lineto(xx+XT[22],yy-ZT[22],pdc);
moveto(xx+XT[3],yy-ZT[3],pdc);
lineto(xx+XT[10],yy-ZT[10],pdc);
moveto(xx+XT[2],yy-ZT[2],pdc);
lineto(xx+XT[9],yy-ZT[9],pdc);
moveto(xx+XT[12],yy-ZT[12],pdc);
lineto(xx+XT[5],yy-ZT[5],pdc);
moveto(xx+XT[14],yy-ZT[14],pdc);
lineto(xx+XT[22],yy-ZT[22],pdc);
moveto(xx+XT[16],yy-ZT[16],pdc);
lineto(xx+XT[21],yy-ZT[21],pdc);
moveto(xx+XT[18],yy-ZT[18],pdc);
lineto(xx+XT[20],yy-ZT[20],pdc);
moveto(xx+XT[11],yy-ZT[11],pdc);
lineto(xx+XT[15],yy-ZT[15],pdc);
moveto(xx+XT[8],yy-ZT[8],pdc);
lineto(xx+XT[17],yy-ZT[17],pdc);
}
void CMyClass::Drawzdc()
{
int I;
CFrameWnd* pWnd=(CFrameWnd*)AfxGetApp()->m_pMainWnd;
CDC* pdc=pWnd->GetActiveView()->GetDC();
CRect rr;
::GetClientRect(pWnd->GetActiveView()->m_hWnd,rr);
xx=rr.right/3;
yy=rr.bottom*2/4;
MCalculate(A);//作正等侧投影变换
DrawText();
moveto(xx+XT[1],yy-YT[1],pdc);
for(I=2;I<=3;++I)//画出正等测图
lineto(xx+XT[I],yy-YT[I],pdc);
moveto(xx+XT[5],yy-YT[5],pdc);
for(I=6;I<13;++I)
lineto(xx+XT[I],yy-YT[I],pdc);
moveto(xx+XT[14],yy-YT[14],pdc);
for(I=15;I<=18;++I)
lineto(xx+XT[I],yy-YT[I],pdc);
moveto(xx+XT[19],yy-YT[19],pdc);
for(I=20;I<=22;++I)
lineto(xx+XT[I],yy-YT[I],pdc);
moveto(xx+XT[1],yy-YT[1],pdc);
lineto(xx+XT[6],yy-ZT[6],pdc);
moveto(xx+XT[7],yy-YT[7],pdc);
lineto(xx+XT[19],yy-YT[19],pdc);
moveto(xx+XT[13],yy-YT[13],pdc);
lineto(xx+XT[22],yy-YT[22],pdc);
moveto(xx+XT[3],yy-YT[3],pdc);
lineto(xx+XT[10],yy-YT[10],pdc);
moveto(xx+XT[2],yy-YT[2],pdc);
lineto(xx+XT[9],yy-YT[9],pdc);
moveto(xx+XT[12],yy-YT[12],pdc);
lineto(xx+XT[5],yy-YT[5],pdc);
moveto(xx+XT[14],yy-YT[14],pdc);
lineto(xx+XT[22],yy-YT[22],pdc);
moveto(xx+XT[16],yy-YT[16],pdc);
lineto(xx+XT[21],yy-YT[21],pdc);
moveto(xx+XT[18],yy-YT[18],pdc);
lineto(xx+XT[20],yy-YT[20],pdc);
moveto(xx+XT[11],yy-YT[11],pdc);
lineto(xx+XT[15],yy-YT[15],pdc);
moveto(xx+XT[8],yy-YT[8],pdc);
lineto(xx+XT[17],yy-YT[17],pdc);
pWnd->GetActiveView()->ReleaseDC(pdc);
}
//绘制正二测图
void CMyClass::Drawzec()
{
int I;
CFrameWnd* pWnd=(CFrameWnd*)AfxGetApp()->m_pMainWnd;
CDC* pdc=pWnd->GetActiveView()->GetDC();
CRect rr;
::GetClientRect(pWnd->GetActiveView()->m_hWnd,rr);
xx=rr.right/3;
yy=rr.bottom*2/3;
MCalculate(A);//作正等侧投影变换
DrawText();
moveto(xx+XT[1],yy-YT[1],pdc);//下面语句画出正二测图
for(I=2;I<=22;++I)
lineto(xx+XT[I],yy-YT[I],pdc);
moveto(xx+XT[1],yy-YT[1],pdc);
lineto(xx+XT[4],yy-ZT[4],pdc);
moveto(xx+XT[1],yy-YT[1],pdc);
lineto(xx+XT[6],yy-YT[6],pdc);
moveto(xx+XT[7],yy-YT[7],pdc);
lineto(xx+XT[19],yy-YT[19],pdc);
moveto(xx+XT[13],yy-YT[13],pdc);
lineto(xx+XT[22],yy-YT[22],pdc);
moveto(xx+XT[3],yy-YT[3],pdc);
lineto(xx+XT[10],yy-YT[10],pdc);
moveto(xx+XT[2],yy-YT[2],pdc);
lineto(xx+XT[9],yy-YT[9],pdc);
moveto(xx+XT[12],yy-YT[12],pdc);
lineto(xx+XT[5],yy-YT[5],pdc);
moveto(xx+XT[14],yy-YT[14],pdc);
lineto(xx+XT[22],yy-YT[22],pdc);
moveto(xx+XT[16],yy-YT[16],pdc);
lineto(xx+XT[21],yy-YT[21],pdc);
moveto(xx+XT[18],yy-YT[18],pdc);
lineto(xx+XT[20],yy-YT[20],pdc);
moveto(xx+XT[11],yy-YT[11],pdc);
lineto(xx+XT[15],yy-YT[15],pdc);
moveto(xx+XT[8],yy-YT[8],pdc);
lineto(xx+XT[17],yy-YT[17],pdc);
pWnd->GetActiveView()->ReleaseDC(pdc);
}
//绘制斜等测图
void CMyClass::Drawxdc()
{
int I;
CFrameWnd* pWnd=(CFrameWnd*)AfxGetApp()->m_pMainWnd;
CDC* pdc=pWnd->GetActiveView()->GetDC();
CRect rr;
::GetClientRect(pWnd->GetActiveView()->m_hWnd,rr);
xx=rr.right/3;
yy=rr.bottom*2/3;
MCalculate(A);//作正等侧投影变换
DrawText();
moveto(xx+XT[1],yy-YT[1],pdc);
for(I=6;I<=13;++I)
lineto(xx+XT[I],yy-XT[I],pdc);
moveto(xx+XT[15],yy-YT[15],pdc);
for(I=16;I<=18;++I)
lineto(xx+XT[I],yy-XT[I],pdc);
moveto(xx+XT[19],yy-YT[19],pdc);
for(I=20;I<=22;++I)
lineto(xx+XT[I],yy-XT[I],pdc);
moveto(xx+XT[1],yy-YT[1],pdc);
lineto(xx+XT[6],yy-YT[6],pdc);
moveto(xx+XT[7],yy-YT[7],pdc);
lineto(xx+XT[19],yy-YT[19],pdc);
moveto(xx+XT[13],yy-YT[13],pdc);
lineto(xx+XT[22],yy-YT[22],pdc);
moveto(xx+XT[3],yy-YT[3],pdc);
lineto(xx+XT[10],yy-YT[10],pdc);
moveto(xx+XT[2],yy-YT[2],pdc);
lineto(xx+XT[9],yy-YT[9],pdc);
moveto(xx+XT[12],yy-YT[12],pdc);
lineto(xx+XT[5],yy-YT[5],pdc);
moveto(xx+XT[16],yy-YT[16],pdc);
lineto(xx+XT[21],yy-YT[21],pdc);
moveto(xx+XT[18],yy-YT[18],pdc);
lineto(xx+XT[20],yy-YT[20],pdc);
moveto(xx+XT[11],yy-YT[11],pdc);
lineto(xx+XT[15],yy-YT[15],pdc);
moveto(xx+XT[8],yy-YT[8],pdc);
lineto(xx+XT[17],yy-YT[17],pdc);
pWnd->GetActiveView()->ReleaseDC(pdc);
}
//在(5,5)处输出当前所画图形的名称
void CMyClass::DrawText()
{
CFrameWnd* pWnd=(CFrameWnd*)AfxGetApp()->m_pMainWnd;
CDC* pdc=pWnd->GetActiveView()->GetDC();
CTran3DView* pView=(CTran3DView*)pWnd->GetActiveView();
pdc->TextOut(5,5,pView->m_str);
pWnd->GetActiveView()->ReleaseDC(pdc);
}//绘制透视图
void CMyClass::DrawPers()
{
//投影时初始值即正弦值和余弦值及乘积的计算、赋值
double Th,Ph;
Th= PI*Theta/180;
Ph= PI*Phi/180;
Aux1=sin(Th);
Aux2=sin(Ph);
Aux3=cos(Th);
Aux4=cos(Ph);
Aux5=Aux3+Aux2;
Aux6=Aux1+Aux2;
Aux7=Aux3+Aux4;
Aux8=Aux1+Aux4;
DrawCube();
}
//绘制给定数据点的透视图
void CMyClass::DrawCube()
{
CFrameWnd* pWnd=(CFrameWnd*)AfxGetApp()->m_pMainWnd;
CDC* pdc=pWnd->GetActiveView()->GetDC();
CRect rr;
::GetClientRect(pWnd->GetActiveView()->m_hWnd,rr);
ReadCube();
int i=1;
while(CP[i]!=-1)
{
if(CP[i]==0)WMoveTo(XP[i],YP[i],ZP[i],pdc,rr.right,rr.bottom);
else WLineTo(XP[i],YP[i],ZP[i],pdc,rr.right,rr.bottom);
i=i+1;
}
//输出数据参数
CString s_str;
s_str.Format("%s %f %s %f %s %f %s %f","Theta=",Theta,"Phi=","Rol",Rol,"DE=",DE);
pdc->TextOut(5,5,s_str);
pWnd->GetActiveView()->ReleaseDC(pdc);
}
void CMyClass::ReadCube()
{
//次函数赋立体上顶点的齐次坐标值
XP[1]=1; YP[1]=1; ZP[1]=1; CP[1]=0;
//数组CP中元素非1的原因,参见函数DrawCube()中它们的作用
XP[2]=1; YP[2]=-1; ZP[2]=1; CP[2]=1;
XP[3]=-1; YP[3]=-1; ZP[3]=1; CP[3]=1;
XP[4]=-1; YP[4]=1; ZP[4]=1; CP[4]=1;
XP[5]=1; YP[5]=1; ZP[5]=1; CP[5]=1;
XP[6]=1; YP[6]=1; ZP[6]=-1; CP[6]=1;
XP[7]=1; YP[7]=-1; ZP[7]=-1; CP[7]=1;
XP[8]=-1; YP[8]=-1; ZP[8]=-1; CP[8]=1;
XP[9]=-1; YP[9]=1; ZP[9]=-1; CP[9]=1;
XP[10]=1; YP[10]=1; ZP[10]=-1; CP[10]=1;
XP[11]=1; YP[11]=-1; ZP[11]=1; CP[11]=0;
XP[12]=1; YP[12]=-1; ZP[12]=1; CP[12]=1;
XP[13]=-1; YP[13]=-1; ZP[13]=1; CP[13]=0;
XP[14]=-1; YP[14]=-1; ZP[14]=-1; CP[14]=1;
XP[15]=-1; YP[15]=1; ZP[15]=1; CP[15]=0;
XP[16]=-1; YP[16]=1; ZP[16]=-1; CP[16]=1;
XP[17]=0.5; YP[17]=1; ZP[17]=-1; CP[17]=0;
XP[18]=0.5; YP[18]=1; ZP[18]=0.5; CP[18]=1;
XP[19]=-0.5; YP[19]=1; ZP[19]=0.5; CP[19]=1;
XP[20]=-0.5; YP[20]=1; ZP[20]=-1; CP[20]=1;
XP[21]=0; YP[21]=0; ZP[21]=0; CP[21]=-1;
}
//用三维点坐标直接从当前画线达到一点的函数
void CMyClass::WLineTo(double x,double y,double z,CDC* pdc, int MaxX, int MaxY)
{
int XScreen,YScreen;
Project(x,y,z);
XScreen=(int)floor(0.5+XProj+MaxX/2);
YScreen=(int)floor(0.5+MaxY/2-YProj);
pdc->LineTo(XScreen,YScreen);
}
//三维坐标下直接将当前点移动到某点的函数
void CMyClass::WMoveTo(double x,double y,double z,CDC* pdc,int MaxX,int MaxY)
{
int XScreen,YScreen;
Project(x,y,z);
XScreen=(int)floor(0.5+XProj+MaxX/2);
YScreen=(int)floor(0.5+MaxY/2-YProj);
pdc->MoveTo(XScreen,YScreen);
}
void CMyClass::Project(double x,double y,double z)
{
double XObs,YObs,ZObs;
XObs=-x*Aux1+y*Aux3;
YObs=-x*Aux5-y*Aux6+z*Aux4;
ZObs=-x*Aux7-y*Aux8-z*Aux2+Rol;
XProj=DE*XObs/ZObs*8;
YProj=DE*XObs/ZObs*8;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -