?? 三維變換view.cpp
字號:
// 三維變換View.cpp : implementation of the CMyView class
//
#include "stdafx.h"
#include "三維變換.h"
#include "BaseClass.h"
#include "三維變換Doc.h"
#include "三維變換View.h"
#include "math.h"
#define PI 3.141592654
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMyView
IMPLEMENT_DYNCREATE(CMyView, CView)
BEGIN_MESSAGE_MAP(CMyView, CView)
//{{AFX_MSG_MAP(CMyView)
ON_COMMAND(ID_TRANSLATION, OnTranslation)
ON_COMMAND(ID_H, OnH)
ON_COMMAND(ID_MIRROR_O, OnMirrorO)
ON_COMMAND(ID_MIRROR_OXY, OnMirrorOxy)
ON_COMMAND(ID_MIRROR_OYZ, OnMirrorOyz)
ON_COMMAND(ID_MIRROR_OZX, OnMirrorOzx)
ON_COMMAND(ID_MIRROR_X, OnMirrorX)
ON_COMMAND(ID_MIRROR_Y, OnMirrorY)
ON_COMMAND(ID_MIRROR_Z, OnMirrorZ)
ON_COMMAND(ID_PRP, OnPrp)
ON_COMMAND(ID_ROTATION_X, OnRotationX)
ON_COMMAND(ID_ROTATION_Y, OnRotationY)
ON_COMMAND(ID_SCALING_S, OnScalingS)
ON_COMMAND(ID_SCALING_XYZ, OnScalingXyz)
ON_COMMAND(ID_SH_X, OnShX)
ON_COMMAND(ID_SH_Y, OnShY)
ON_COMMAND(ID_V, OnV)
ON_COMMAND(ID_W, OnW)
ON_COMMAND(ID_SE, OnSe)
ON_COMMAND(ID_ST, OnSt)
ON_COMMAND(ID_VE, OnVe)
ON_COMMAND(ID_VT, OnVt)
ON_WM_RBUTTONDOWN()
ON_COMMAND(ID_ROTATION_Z, OnRotationZ)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMyView construction/destruction
CMyView::CMyView()
{
// TODO: add construction code here
m_Select=SEL_NONE;
}
CMyView::~CMyView()
{
}
BOOL CMyView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CMyView drawing
void CMyView::OnDraw(CDC* pDC)
{
CMyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDC->TextOut(10,10,"點擊右鍵出現正立方體原圖");
// TODO: add draw code for native data here
}
/////////////////////////////////////////////////////////////////////////////
// CMyView printing
BOOL CMyView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CMyView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CMyView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CMyView diagnostics
#ifdef _DEBUG
void CMyView::AssertValid() const
{
CView::AssertValid();
}
void CMyView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CMyDoc* CMyView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc)));
return (CMyDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMyView message handlers
void CMyView::OnTranslation()
{
// TODO: Add your command handler code here
m_Select=SEL_TS;
m_str="平移";
CBaseClass my1; //構造新的CBaseClass對象
int i,j;
for ( i=1;i<=4;++i)
{
for ( j=1;j<=4;++j)
my1.A[i][j]=0;
}
my1.A[1][1]=1;
my1.A[2][2]=1;
my1.A[4][4]=1;
my1.A[3][3]=1;
my1.A[4][1]=6; //x軸方向上平移
my1.A[4][2]=4; //y軸方向上平移
my1.A[4][3]=4; //z軸方向上平移
// RedrawWindow();
my1.Draw();
}
void CMyView::OnH()
{
// TODO: Add your command handler code here
m_Select=SEL_H;
m_str="俯視圖";
int i,j;
CBaseClass my1; //構造新的CMyClass對象
//將俯視圖變換矩陣清零
for (i=1;i<=4;++i)
{
for (j=1;j<=4;++j)
my1.Ah[i][j]=0;
}
//給俯視圖變換矩陣賦值
my1.Ah[1][1]=1;
my1.Ah[2][3]=-1;
// my1.Ah[4][3]=10; //俯視圖平移量
my1.Ah[4][4]=1;
RedrawWindow();
my1.Display();
}
void CMyView::OnMirrorO()
{
// TODO: Add your command handler code here
m_Select=SEL_MO;
m_str="關于原點對稱";
CBaseClass my1; //構造新的CBaseClass對象
int i,j;
for ( i=1;i<=4;++i)
{
for ( j=1;j<=4;++j)
my1.A[i][j]=0;
}
my1.A[1][1]=-1;
my1.A[2][2]=-1;
my1.A[3][3]=-1;
my1.A[4][4]=1;
// RedrawWindow();
my1.Draw();
}
void CMyView::OnMirrorOxy()
{
// TODO: Add your command handler code here
m_Select=SEL_MOXY;
m_str="關于OXY平面對稱";
CBaseClass my1; //構造新的CBaseClass對象
int i,j;
for ( i=1;i<=4;++i)
{
for ( j=1;j<=4;++j)
my1.A[i][j]=0;
}
my1.A[1][1]=1;
my1.A[2][2]=1;
my1.A[3][3]=-1;
my1.A[4][4]=1;
//RedrawWindow();
my1.Draw();
}
void CMyView::OnMirrorOyz()
{
// TODO: Add your command handler code here
m_Select=SEL_MOYZ;
m_str="關于OYZ平面對稱";
CBaseClass my1; //構造新的CBaseClass對象
int i,j;
for ( i=1;i<=4;++i)
{
for ( j=1;j<=4;++j)
my1.A[i][j]=0;
}
my1.A[1][1]=-1;
my1.A[2][2]=1;
my1.A[3][3]=1;
my1.A[4][4]=1;
// RedrawWindow();
my1.Draw();
}
void CMyView::OnMirrorOzx()
{
// TODO: Add your command handler code here
m_Select=SEL_MOZX;
m_str="關于OZX平面對稱";
CBaseClass my1; //構造新的CBaseClass對象
int i,j;
for ( i=1;i<=4;++i)
{
for ( j=1;j<=4;++j)
my1.A[i][j]=0;
}
my1.A[1][1]=1;
my1.A[2][2]=-1;
my1.A[3][3]=1;
my1.A[4][4]=1;
RedrawWindow();
my1.Draw();
}
void CMyView::OnMirrorX()
{
// TODO: Add your command handler code here
m_Select=SEL_MX;
m_str="關于X對稱";
CBaseClass my1; //構造新的CBaseClass對象
int i,j;
for ( i=1;i<=4;++i)
{
for ( j=1;j<=4;++j)
my1.A[i][j]=0;
}
my1.A[1][1]=1;
my1.A[2][2]=-1;
my1.A[3][3]=-1;
my1.A[4][4]=1;
// RedrawWindow();
my1.Draw();
}
void CMyView::OnMirrorY()
{
// TODO: Add your command handler code here
m_Select=SEL_MY;
m_str="關于Y對稱";
CBaseClass my1; //構造新的CBaseClass對象
int i,j;
for ( i=1;i<=4;++i)
{
for ( j=1;j<=4;++j)
my1.A[i][j]=0;
}
my1.A[1][1]=-1;
my1.A[2][2]=1;
my1.A[3][3]=-1;
my1.A[4][4]=1;
// RedrawWindow();
my1.Draw();
}
void CMyView::OnMirrorZ()
{
// TODO: Add your command handler code here
m_Select=SEL_MZ;
m_str="關于Z對稱";
CBaseClass my1; //構造新的CBaseClass對象
int i,j;
for ( i=1;i<=4;++i)
{
for ( j=1;j<=4;++j)
my1.A[i][j]=0;
}
my1.A[1][1]=-1;
my1.A[2][2]=-1;
my1.A[3][3]=1;
my1.A[4][4]=1;
// RedrawWindow();
my1.Draw();
}
void CMyView::OnPrp()
{
// TODO: Add your command handler code here
m_Select=SEL_PRP;
m_str="透視圖";
CBaseClass my1;
my1.ps=1;
int i,j;
for ( i=1;i<=4;++i)
{
for ( j=1;j<=4;++j)
my1.A[i][j]=0;
}
my1.A[1][1]=1;
my1.A[2][2]=1;
my1.A[3][3]=1;
my1.A[4][4]=1;
RedrawWindow();
my1.Draw();
// my1.DrawText();
}
void CMyView::OnRotationX()
{
// TODO: Add your command handler code here
// RedrawWindow();
m_Select=SEL_RX;
m_str="關于X軸旋轉";
CBaseClass my1; //構造新的CBaseClass對象
int i,j;
for ( i=1;i<=4;++i)
{
for ( j=1;j<=4;++j)
my1.A[i][j]=0;
}
my1.A[1][1]=1;
my1.A[2][2]=cos(60*PI/180);//旋轉60度
my1.A[3][2]=sin(60*PI/180);
my1.A[2][3]=-sin(60*PI/180);
my1.A[3][3]=cos(60*PI/180);
my1.A[4][4]=1;
my1.Draw();
}
void CMyView::OnRotationY()
{
// TODO: Add your command handler code here
m_Select=SEL_RY;
m_str="關于Y軸旋轉";
CBaseClass my1; //構造新的CBaseClass對象
int i,j;
for ( i=1;i<=4;++i)
{
for ( j=1;j<=4;++j)
my1.A[i][j]=0;
}
my1.A[2][2]=1;
my1.A[1][1]=cos(60*PI/180);//旋轉60度
my1.A[3][1]=sin(60*PI/180);
my1.A[1][3]=-sin(60*PI/180);
my1.A[3][3]=cos(60*PI/180);
my1.A[4][4]=1;
// RedrawWindow();
my1.Draw();
}
void CMyView::OnScalingS()
{
// TODO: Add your command handler code here
m_Select=SEL_MO;
m_str="整體變比";
CBaseClass my1; //構造新的CBaseClass對象
int i,j;
for ( i=1;i<=4;++i)
{
for ( j=1;j<=4;++j)
my1.A[i][j]=0;
}
my1.A[1][1]=1;
my1.A[2][2]=1;
my1.A[3][3]=1;
my1.A[4][4]=0.5;
// RedrawWindow();
my1.Draw();
}
void CMyView::OnScalingXyz()
{
// TODO: Add your command handler code here
m_Select=SEL_MO;
m_str="XYZ變比";
CBaseClass my1; //構造新的CBaseClass對象
int i,j;
for ( i=1;i<=4;++i)
{
for ( j=1;j<=4;++j)
my1.A[i][j]=0;
}
my1.A[1][1]=2; //x軸方向上比例
my1.A[2][2]=1; //y軸方向上比例
my1.A[3][3]=1; //z軸方向上比例
my1.A[4][4]=1;
// RedrawWindow();
my1.Draw();
}
void CMyView::OnShX()
{
// TODO: Add your command handler code here
m_Select=SEL_SHX;
m_str="X方向錯切";
CBaseClass my1; //構造新的CBaseClass對象
int i,j;
for ( i=1;i<=4;++i)
{
for ( j=1;j<=4;++j)
my1.A[i][j]=0;
}
my1.A[1][1]=1;
my1.A[2][2]=1;
my1.A[3][3]=1;
my1.A[4][4]=1;
my1.A[1][2]=0.5; //為0錯切平面離開Z軸,沿X方向移動
my1.A[1][3]=0.5; //為0錯切平面離開Y軸,沿X方向移動
// RedrawWindow();
my1.Draw();
}
void CMyView::OnShY()
{
// TODO: Add your command handler code here
m_Select=SEL_SHY;
m_str="Y方向錯切";
CBaseClass my1; //構造新的CBaseClass對象
int i,j;
for ( i=1;i<=4;++i)
{
for ( j=1;j<=4;++j)
my1.A[i][j]=0;
}
my1.A[1][1]=1;
my1.A[2][2]=1;
my1.A[3][3]=1;
my1.A[4][4]=1;
my1.A[1][2]=0.5; //為0錯切平面離開Z軸,沿Y方向移動
my1.A[3][2]=0.5; //為0錯切平面離開X軸,沿Y方向移動
// RedrawWindow();
my1.Draw();
}
void CMyView::OnV()
{
// TODO: Add your command handler code here
m_Select=SEL_V;
m_str="主視圖";
int i,j;
CBaseClass my1; //構造新的CMyClass對象
//將主視圖變換矩陣清零
for ( i=1;i<=4;++i)
{
for ( j=1;j<=4;++j)
my1.A[i][j]=0;
}
//給主視圖變換矩陣賦值
my1.A[1][1]=1;
my1.A[3][3]=1;
my1.A[4][4]=1;
RedrawWindow();
my1.Display();
}
void CMyView::OnW()
{
// TODO: Add your command handler code here
m_Select=SEL_H;
m_str="側視圖";
int i,j;
CBaseClass my1; //構造新的CMyClass對象
//將俯視圖變換矩陣清零
//將側視圖變換矩陣清零
for (i=1;i<=4;++i)
{
for (j=1;j<=4;++j)
my1.Aw[i][j]=0;
}
//給側視圖變換矩陣賦值
my1.Aw[2][1]=-1;
my1.Aw[3][3]=1;
my1.Aw[4][4]=1;
RedrawWindow();
my1.Display();
}
void CMyView::OnSe()
{
// TODO: Add your command handler code here
m_Select=SEL_SE;
m_str="斜等測視圖";
int i,j;
CBaseClass my1; //構造新的CBaseClass對象
for ( i=1;i<=4;++i)
{
for ( j=1;j<=4;++j)
my1.A[i][j]=0;
}
my1.A[1][1]=1;
my1.A[2][2]=1;
my1.A[3][1]=0.707f; //X方向錯切位移量
my1.A[3][2]=0.707f; //Y方向錯切位移量
my1.A[4][4]=1;
RedrawWindow();
my1.Drawse();
}
void CMyView::OnSt()
{
// TODO: Add your command handler code here
m_Select=SEL_ST;
m_str="斜二測視圖";
int i,j;
CBaseClass my1; //構造新的CMyClass對象
for ( i=1;i<=4;++i)
{
for ( j=1;j<=4;++j)
my1.A[i][j]=0;
}
my1.A[1][1]=1;
my1.A[2][2]=1;
my1.A[3][1]=0.3535f; //X方向錯切位移量
my1.A[3][2]=0.3535f; //Y方向錯切位移量
my1.A[4][4]=1;
RedrawWindow();
my1.Drawvt();
}
void CMyView::OnVe()
{
// TODO: Add your command handler code here
m_Select=SEL_VE;
m_str="正等測視圖";
int i,j;
CBaseClass my2; //構造新的CMyClass對象
my2.theta_y =45; //Y軸夾角
my2.phi_x=125; //X軸夾角
//給正等測變換矩陣清零
for ( i=1;i<=4;++i)
{
for ( j=1;j<=4;++j)
my2.A[i][j]=0;
}
//給正等測變換矩陣賦值
my2.A[1][1]=(float)cos(my2.theta_y*PI/180);
my2.A[1][2]=(float)sin(my2.theta_y*PI/180)*(float)sin(my2.phi_x*PI/180);
my2.A[2][2]=(float)cos(my2.phi_x*PI/180);
my2.A[3][1]=(float)sin(my2.theta_y*PI/180);
my2.A[3][2]=(float)-cos(my2.theta_y*PI/180)*(float)sin(my2.phi_x*PI/180);
my2.A[4][4]=1;
RedrawWindow();
my2.Drawve();
}
void CMyView::OnVt()
{
// TODO: Add your command handler code here
m_Select=SEL_VT;
m_str="正二測視圖";
int i,j;
CBaseClass my2; //構造新的CMyClass對象
my2.theta_y =115; //Y軸夾角25-115
my2.phi_x=25; //X軸夾角
//給正二測變換矩陣清零
for ( i=1;i<=4;++i)
{
for ( j=1;j<=4;++j)
my2.A[i][j]=0;
}
//給正二測變換矩陣賦值
my2.A[1][1]=(float)cos(my2.theta_y*PI/180);
my2.A[1][2]=(float)sin(my2.theta_y*PI/180)*(float)sin(my2.phi_x*PI/180);
my2.A[2][2]=(float)cos(my2.phi_x*PI/180);
my2.A[3][1]=(float)sin(my2.theta_y*PI/180);
my2.A[3][2]=(float)-cos(my2.theta_y*PI/180)*(float)sin(my2.phi_x*PI/180);
my2.A[4][4]=1;
RedrawWindow();
my2.Drawvt();
}
void CMyView::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_str="原三維圖形";
CBaseClass my1; //構造新的CBaseClass對象
int i,j;
for ( i=1;i<=4;++i)
{
for ( j=1;j<=4;++j)
my1.A[i][j]=0;
}
my1.A[1][1]=1;
my1.A[2][2]=1;
my1.A[3][3]=1;
my1.A[4][4]=1;
RedrawWindow();
my1.Draw();
CView::OnRButtonDown(nFlags, point);
}
void CMyView::OnRotationZ()
{
// TODO: Add your command handler code here
m_Select=SEL_RZ;
m_str="關于Z軸旋轉";
CBaseClass my1; //構造新的CBaseClass對象
int i,j;
for ( i=1;i<=4;++i)
{
for ( j=1;j<=4;++j)
my1.A[i][j]=0;
}
my1.A[3][3]=1;
my1.A[1][1]=cos(60*PI/180);//旋轉60度
my1.A[1][2]=sin(60*PI/180);
my1.A[2][1]=-sin(60*PI/180);
my1.A[2][2]=cos(60*PI/180);
my1.A[4][4]=1;
// RedrawWindow();
my1.Draw();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -