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

📄 class designview.cpp

📁 二维几何图形变换的演示
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// Class DesignView.cpp : implementation of the CClassDesignView class
//

#include "stdafx.h"
#include "Class Design.h"

#include "mainFrm.h"

#include "ExchangeData.h"//为了在Class DesignView.cpp文件中能够用到这几个类的成员变量,
#include "uoQie.h"       // 所以要在文件头上加上这几个自定义类的头文件。
#include "BiLi.h"        //
#include "XuanZhuang.h"  //
#include "PolygonFH.h"   //

#include "math.h"

#include "Class DesignDoc.h"
#include "Class DesignView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define PI 3.14159////////////////////自己定义PI的值,下面要利用正弦余弦函数
/////////////////////////////////////////////////////////////////////////////
// CClassDesignView

IMPLEMENT_DYNCREATE(CClassDesignView, CView)

BEGIN_MESSAGE_MAP(CClassDesignView, CView)
	//{{AFX_MSG_MAP(CClassDesignView)
	ON_COMMAND(ID_POINT, OnPoint)
	ON_COMMAND(ID_LINE, OnLine)
	ON_COMMAND(ID_MULTILINE, OnMultiline)
	ON_COMMAND(ID_LINE_BILI, OnLineBili)
	ON_COMMAND(ID_LINE_XDUICHENG, OnLineXduicheng)
	ON_COMMAND(ID_LINE_YDUICHENG, OnLineYduicheng)
	ON_COMMAND(ID_LINE_OrgDUICHENG, OnLINEOrgDUICHENG)
	ON_COMMAND(ID_LINE_CUOQIE, OnLineCuoqie)
	ON_COMMAND(ID_LINE_XUANZHUANG, OnLineXuanzhuang)
	ON_COMMAND(ID_POINT_XDUICHENG, OnPointXduicheng)
	ON_COMMAND(ID_POINT_YDUICHENG, OnPointYduicheng)
	ON_COMMAND(ID_POINT_OrgDUICHENG, OnPOINTOrgDUICHENG)
	ON_COMMAND(ID_POINT_PINGYI, OnPointPingyi)
	ON_COMMAND(ID_POINT_XUANZHUANG, OnPointXuanzhuang)
	ON_COMMAND(ID_MULTILINE_BILI, OnMultilineBili)
	ON_COMMAND(ID_MULTILINE_XDUICHENG, OnMultilineXduicheng)
	ON_COMMAND(ID_MULTILINE_OrgDUICHENG, OnMULTILINEOrgDUICHENG)
	ON_COMMAND(ID_MULTILINE_YDUICHENG, OnMultilineYduicheng)
	ON_COMMAND(ID_MULTILINE_CUOQIE, OnMultilineCuoqie)
	ON_COMMAND(ID_MULTILINE_XUANZHUANG, OnMultilineXuanzhuang)
	ON_COMMAND(ID_MULTILINE_PINGYI, OnMultilinePingyi)
	ON_COMMAND(ID_Multiline_fuhe, OnMultilinefuhe)
	ON_COMMAND(ID_POINT_qingping, OnPOINTqingping)
	ON_COMMAND(ID_LINE_qingping, OnLINEqingping)
	ON_COMMAND(ID_MULTILINE_qingping, OnMULTILINEqingping)
	ON_WM_MOUSEMOVE()
	ON_COMMAND(ID_LINE_PINGYI, OnLinePingyi)
	ON_UPDATE_COMMAND_UI(ID_POINT_XDUICHENG, OnUpdatePointXduicheng)
	ON_UPDATE_COMMAND_UI(ID_POINT_YDUICHENG, OnUpdatePointYduicheng)
	ON_UPDATE_COMMAND_UI(ID_POINT_OrgDUICHENG, OnUpdatePOINTOrgDUICHENG)
	ON_UPDATE_COMMAND_UI(ID_POINT, OnUpdatePoint)
	ON_UPDATE_COMMAND_UI(ID_LINE, OnUpdateLine)
	ON_UPDATE_COMMAND_UI(ID_LINE_XDUICHENG, OnUpdateLineXduicheng)
	ON_UPDATE_COMMAND_UI(ID_LINE_YDUICHENG, OnUpdateLineYduicheng)
	ON_UPDATE_COMMAND_UI(ID_LINE_OrgDUICHENG, OnUpdateLINEOrgDUICHENG)
	ON_UPDATE_COMMAND_UI(ID_MULTILINE, OnUpdateMultiline)
	ON_UPDATE_COMMAND_UI(ID_MULTILINE_XDUICHENG, OnUpdateMultilineXduicheng)
	ON_UPDATE_COMMAND_UI(ID_MULTILINE_YDUICHENG, OnUpdateMultilineYduicheng)
	ON_UPDATE_COMMAND_UI(ID_MULTILINE_OrgDUICHENG, OnUpdateMULTILINEOrgDUICHENG)
	//}}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()

/////////////////////////////////////////////////////////////////////////////
// CClassDesignView construction/destruction

CClassDesignView::CClassDesignView()
{ 
	// TODO: add construction code here
}

CClassDesignView::~CClassDesignView()
{
}

BOOL CClassDesignView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs
	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CClassDesignView drawing

void CClassDesignView::OnDraw(CDC* pDC)
{
	CClassDesignDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

    CRect rect; ////声明一个CRect类变量
	GetClientRect(&rect); //////获取程序窗口的客户区坐标
 //   ClientToScreen(&rect);//把客户区坐标转化为屏幕坐标
    
	int ORGX=rect.right;
	int ORGY=rect.bottom;
	pDC->SetMapMode(MM_LOMETRIC);//定义映射模式
	pDC->SetViewportOrg(ORGX/2,ORGY/2);
	pDC->SetViewportExt(ORGX,ORGY);//////以上都是将获得的客户区矩阵的中心坐标设为
	                               ///// 逻辑坐标的中心坐标
	
    pDC->MoveTo(ORGX*2,0);
	pDC->LineTo(-ORGX*2,0);
	pDC->MoveTo(0,ORGY*2);
    pDC->LineTo(0,-ORGY*2);
    pDC->TextOut(ORGX+350,-15,"X");
	pDC->TextOut(15,ORGY+200,"Y");
	pDC->TextOut(10,-10,"0");

switch(CurrenDraw)////////////////////////实现多分支语句选择结构
{

case m_bPoint ://///////////////////////画原画点
	  {
		CBrush BlueBrush(RGB(0,0,255));//蓝色画刷
    	pDC->SelectObject(&BlueBrush); //将画刷选入设备环境
	    pDC->Ellipse(150,150,170,170);  //设定位置画原画点,不过将描点改为画一个圆,增强可视性
	
	  }break;

  case m_bPoint_Xduicheng://////////////画点关于X轴对称
	  {
     	CBrush BlueBrush(RGB(0,0,255));//蓝色画刷
    	pDC->SelectObject(&BlueBrush); //将画刷选入设备环境
		
		pDC->Ellipse(150,150,170,170);//设定位置画原画点,不过将描点改为画一个圆,增强可视性
        
		CBrush BlueBrush1(RGB(0,255,0));//绿色画刷
    	pDC->SelectObject(&BlueBrush1); //将画刷选入设备环境
		
		pDC->Ellipse(150,-150,170,-170); //关于X轴对称后的画点
	
	  }break;
  case  m_bPoint_Yduicheng: //////////////画点关于Y轴对称
	  {
		CBrush BlueBrush(RGB(0,0,255));
    	pDC->SelectObject(&BlueBrush); 
		
		pDC->Ellipse(150,150,170,170);
        
		CBrush BlueBrush1(RGB(0,255,0));
    	pDC->SelectObject(&BlueBrush1); 
		
		pDC->Ellipse(-150,150,-170,170);////关于轴对称后的画点
	
	  }break;
  case m_bPoint_ORGduicheng://////////////画点关于原点对称
	  {
		CBrush BlueBrush(RGB(0,0,255));
    	pDC->SelectObject(&BlueBrush); 
		
		pDC->Ellipse(150,150,170,170);
        
		CBrush BlueBrush1(RGB(0,255,0));
    	pDC->SelectObject(&BlueBrush1); 
		
		pDC->Ellipse(-150,-150,-170,-170);
	
	  }break;
  case m_bPoint_Pingyi: //////////////画点平移变换 
	  {
		CBrush BlueBrush(RGB(0,0,255));
    	pDC->SelectObject(&BlueBrush); 
		
		pDC->Ellipse(150,150,170,170);
        
		CBrush BlueBrush1(RGB(0,255,0));
    	pDC->SelectObject(&BlueBrush1); 
		
		pDC->Ellipse(150+dfData1,150+dfData2,170+dfData1,170+dfData2);
		
	  }break;
  case m_bPoint_Xuanzhuang://////////////画点旋转变换
	  {
		CBrush BlueBrush(RGB(0,0,255));
    	pDC->SelectObject(&BlueBrush); 
	
		pDC->Ellipse(150,150,170,170);
        
		CBrush BlueBrush1(RGB(0,255,0));
    	pDC->SelectObject(&BlueBrush1); 
		
		pDC->Ellipse(int( 160*cos(dfData1*PI/180)-160*sin(dfData1*PI/180)-10 ),
			         int( 160*sin(dfData1*PI/180)+160*cos(dfData1*PI/180)+10 ),
     				 int( 160*cos(dfData1*PI/180)-160*sin(dfData1*PI/180)+10 ),
					 int( 160*sin(dfData1*PI/180)+160*cos(dfData1*PI/180)-10 )
					 );/////画点旋转变换算法
		
	  }break;
  case m_bLine :////////////////////画原直线
	  { 
		  pDC->MoveTo(250,250);
		  pDC->LineTo(15,20);
		
	  }break;
  case m_bLine_bili:////////////////////画原直线比例变换

	  {
		int Org_Rec[3][3]={{dfData1,0,0},{0,dfData1,0},{0,0,1}};/////只需改这组数组的数据即可,其为二维变换矩阵	
        int Before_Rec[2][3]={{250,250,1},{15,20,1}};
        int After_Rec[2][3]={0};////数组赋值
	
		pDC->MoveTo( Before_Rec[0][0], Before_Rec[0][1]);
		pDC->LineTo( Before_Rec[1][0], Before_Rec[1][1]);////画原直线
		
		CPen SolidPen(PS_SOLID,3,RGB(255,0,0));//创建红色画笔
        pDC->SelectObject(&SolidPen);//将画笔选入设备环境	
	    
		SetData(Org_Rec,After_Rec,Before_Rec);/////调用自定义函数完成矩阵相乘并赋值
		
		pDC->MoveTo(After_Rec[0][0]+200,After_Rec[0][1]);
        pDC->LineTo(After_Rec[1][0]+200,After_Rec[1][1]);//////画出比例变换后的直线
	  
	  }break;
        
  case	m_bLine_Xduicheng:////////////////////画原直线关于X轴对称变换
	  {
		int Org_Rec[3][3]={{1,0,0},{0,-1,0},{0,0,1}};	
        int Before_Rec[2][3]={{250,250,1},{15,20,1}};
        int After_Rec[2][3]={0}; 
	
  		pDC->MoveTo( Before_Rec[0][0], Before_Rec[0][1]);
		pDC->LineTo( Before_Rec[1][0], Before_Rec[1][1]);
		
		CPen SolidPen(PS_SOLID,2,RGB(255,0,0));//创建红色画笔
        pDC->SelectObject(&SolidPen);//将画笔选入设备环境	
	    
	       SetData(Org_Rec,After_Rec,Before_Rec);
		
		pDC->MoveTo(After_Rec[0][0],After_Rec[0][1]);////  画关于X轴对称
        pDC->LineTo(After_Rec[1][0],After_Rec[1][1]);////  变换后直线
	  }break;
  case m_bLine_Yduicheng:////////////////////画原直线关于Y轴对称变换
	  {
		int Org_Rec[3][3]={{-1,0,0},{0,1,0},{0,0,1}};	
        int Before_Rec[2][3]={{250,250,1},{15,20,1}};
        int After_Rec[2][3]={0}; 
	
       
       
		pDC->MoveTo( Before_Rec[0][0], Before_Rec[0][1]);
		pDC->LineTo( Before_Rec[1][0], Before_Rec[1][1]);
		
		CPen SolidPen(PS_SOLID,2,RGB(255,0,0));//创建红色画笔
        pDC->SelectObject(&SolidPen);//将画笔选入设备环境	
	    
		   SetData(Org_Rec,After_Rec,Before_Rec);
		 
		pDC->MoveTo(After_Rec[0][0],After_Rec[0][1]);////  画关于Y轴对称
        pDC->LineTo(After_Rec[1][0],After_Rec[1][1]);////  变换后直线
   
	  }break;
	
  case	m_bLine_Orgduicheng:////////////////////画原直线关于原点对称变换  

	  {
		int Org_Rec[3][3]={{-1,0,0},{0,-1,0},{0,0,1}};	
        int Before_Rec[2][3]={{250,250,1},{15,20,1}};
        int After_Rec[2][3]={0}; 
	
   		pDC->MoveTo( Before_Rec[0][0], Before_Rec[0][1]);
		pDC->LineTo( Before_Rec[1][0], Before_Rec[1][1]);
		
		CPen SolidPen(PS_SOLID,2,RGB(255,0,0));//创建红色画笔
        pDC->SelectObject(&SolidPen);//将画笔选入设备环境	
	    
			SetData(Org_Rec,After_Rec,Before_Rec);
		
		pDC->MoveTo(After_Rec[0][0],After_Rec[0][1]);////  画关于原点对称
        pDC->LineTo(After_Rec[1][0],After_Rec[1][1]);////  变换后直线
   
	  }break;
   
  case	m_bLine_CuoQie://直线错切
	
	  { 
		int Org_Rec[3][3]={{1,dfData2,0},{dfData1,1,0},{0,0,1}};	
        int Before_Rec[2][3]={{250,250,1},{15,20,1}};
        int After_Rec[2][3]={0}; 
	
  		pDC->MoveTo( Before_Rec[0][0], Before_Rec[0][1]);
		pDC->LineTo( Before_Rec[1][0], Before_Rec[1][1]);
		
		CPen SolidPen(PS_SOLID,2,RGB(255,0,0));//创建红色画笔
        pDC->SelectObject(&SolidPen);//将画笔选入设备环境	
	    
			SetData(Org_Rec,After_Rec,Before_Rec);
		
		pDC->MoveTo(After_Rec[0][0],After_Rec[0][1]);
        pDC->LineTo(After_Rec[1][0],After_Rec[1][1]);
	  }break;
  case	m_bLine_Xuanzhuang://直线旋转变换
	
	  {
      
		double Org_Rec[3][3]={  
								{cos(dfData1*PI/180),sin(dfData1*PI/180),0.0},
								{-sin(dfData1*PI/180),cos(dfData1*PI/180),0.0},
								{0.0,0.0,1.0}
							 };
        int Before_Rec[2][3]={{250,250,1},{15,20,1}};
        double After_Rec[2][3]={{0.0},{0.0}}; 
	
  		pDC->MoveTo(Before_Rec[0][0],Before_Rec[0][1]);
		pDC->LineTo(Before_Rec[1][0],Before_Rec[1][1]);
		
		CPen SolidPen(PS_SOLID,2,RGB(255,0,0));//创建红色画笔
        pDC->SelectObject(&SolidPen);//将画笔选入设备环境	
	    
		for(int i=0;i<=1;i++)
	      for(int j=0;j<=2;j++)
		  {
	        for(int k=0;k<=2;k++)
           
		   After_Rec[i][j]+=Before_Rec[i][k]*Org_Rec[k][j];//////利用循环为数组赋值
		  }
        pDC->MoveTo((int)After_Rec[0][0],(int)After_Rec[0][1]);
        pDC->LineTo((int)After_Rec[1][0],(int)After_Rec[1][1]);

	  }break;

  case	(m_bLine_Pingyi):	//直线平移变换
    
	     //   ShowData(); //DestroyWindow();
	  {  
         

 		int Org_Rec[3][3]={{1,0,0},{0,1,0},{dfData1,dfData2,1}};	
        int Before_Rec[2][3]={{250,250,1},{15,20,1}};
        int After_Rec[2][3]={0}; 
	

   		pDC->MoveTo( Before_Rec[0][0], Before_Rec[0][1]);
		pDC->LineTo( Before_Rec[1][0], Before_Rec[1][1]);

⌨️ 快捷键说明

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