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

📄 graphicsalgorithmview.cpp

📁 平面图形变换的源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// GraphicsAlgorithmView.cpp : implementation of the CGraphicsAlgorithmView class
//

#include "stdafx.h"
#include "GraphicsAlgorithm.h"

#include "GraphicsAlgorithmDoc.h"
#include "GraphicsAlgorithmView.h"
#include "LWidth.h"
#include "ttt.h"
#include "math.h"
#include "stdio.h"

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

/////////////////////////////////////////////////////////////////////////////
// CGraphicsAlgorithmView

IMPLEMENT_DYNCREATE(CGraphicsAlgorithmView, CView)

BEGIN_MESSAGE_MAP(CGraphicsAlgorithmView, CView)
	//{{AFX_MSG_MAP(CGraphicsAlgorithmView)
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_MOUSEMOVE()
	ON_COMMAND(idCurColor, OnidCurColor)
	ON_COMMAND(idClear, OnidClear)
	ON_COMMAND(idPolygon, OnidPolygon)
	ON_COMMAND(IDCLOSE, OnClose)
	ON_COMMAND(idFillColor, OnidFillColor)
	ON_COMMAND(idLineWidth, OnidLineWidth)
	ON_COMMAND(idabout, Onidabout)
	ON_COMMAND(idTransShift, OnidTransShift)
	ON_COMMAND(idTransScale, OnidTransScale)
	ON_COMMAND(idTransRotation, OnidTransRotation)
	ON_COMMAND(idTransDonghua1, OnidTransDonghua1)
	ON_COMMAND(idTransXMirror, OnidTransXMirror)
	ON_COMMAND(idTransYMirror, OnidTransYMirror)
	ON_COMMAND(idTransPMirror, OnidTransPMirror)
	ON_COMMAND(idTansCuoqie, OnidTansCuoqie)
	ON_COMMAND(idSecPoly, OnidSecPoly)
	ON_COMMAND(idFirPicToSecPic, OnidFirPicToSecPic)
	ON_COMMAND(idTransDongHua3, OnidTransDongHua3)
	ON_COMMAND(idCrossBar, OnidCrossBar)
	//}}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()

/////////////////////////////////////////////////////////////////////////////
// CGraphicsAlgorithmView construction/destruction

CGraphicsAlgorithmView::CGraphicsAlgorithmView()
{
	// TODO: add construction code here
//	tBreLine=0;
//	tDDALine=1;

}

CGraphicsAlgorithmView::~CGraphicsAlgorithmView()
{
}

BOOL CGraphicsAlgorithmView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CGraphicsAlgorithmView drawing

void CGraphicsAlgorithmView::OnDraw(CDC* Gra)
{
	CGraphicsAlgorithmDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
		Gra->SaveDC();	cls();
}

/////////////////////////////////////////////////////////////////////////////
// CGraphicsAlgorithmView printing

BOOL CGraphicsAlgorithmView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CGraphicsAlgorithmView::OnBeginPrinting(CDC* /*Gra*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CGraphicsAlgorithmView::OnEndPrinting(CDC* /*Gra*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CGraphicsAlgorithmView diagnostics

#ifdef _DEBUG
void CGraphicsAlgorithmView::AssertValid() const
{
	CView::AssertValid();
}

void CGraphicsAlgorithmView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CGraphicsAlgorithmDoc* CGraphicsAlgorithmView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CGraphicsAlgorithmDoc)));
	return (CGraphicsAlgorithmDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CGraphicsAlgorithmView message handlers



void CGraphicsAlgorithmView::OnInitialUpdate() 
{
	CView::OnInitialUpdate();
	
	// TODO: Add your specialized code here and/or call the base class
	Gra=new CClientDC(this);
	Gra->SetBkColor(RGB(0xff,0xff,0xff));
	Curcolor=RGB(255,0,255);
	FillColor=RGB(255,0,255);
	CurPen.CreatePen(PS_SOLID,3,Curcolor);
	OrgPen.CreatePen(PS_SOLID,3,RGB(255,0,255));
	MouDown=false;
	FunSel=-1;
}
void CGraphicsAlgorithmView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	MouDown=true;
	switch(FunSel)
	{
	case 0:
		break;
	case 1:
	BegP=point;
	if(PNum==0)
	{
		ContP[PNum++]=point;
	}
	else
	{
		BegP=ContP[PNum-1];
	}
	PreP=BegP;

	Gra->SetROP2(R2_XORPEN);
	Gra->SelectObject(&OrgPen);  
	Gra->MoveTo(BegP.x-10,BegP.y);	Gra->LineTo(BegP.x+10,BegP.y);
	Gra->MoveTo(BegP.x,BegP.y-10);	Gra->LineTo(BegP.x,BegP.y+10);
	Gra->MoveTo(BegP);	Gra->LineTo(PreP);
		break;
	case 2:
	BegP=point;PreP=BegP;
	Gra->SetROP2(R2_XORPEN);
	Gra->SelectObject(&OrgPen);  
	Gra->MoveTo(BegP.x-10,BegP.y);	Gra->LineTo(BegP.x+10,BegP.y);
	Gra->MoveTo(BegP.x,BegP.y-10);	Gra->LineTo(BegP.x,BegP.y+10);
	Gra->MoveTo(BegP);	Gra->LineTo(PreP);
	TransShift(PreP-BegP);
		break;
	case 3:		
			Gra->SetROP2(R2_XORPEN);
			Gra->SelectObject(&CurPen);  
			BegP=point;PreP=point;
			Gra->MoveTo(BegP.x-10,BegP.y);	Gra->LineTo(BegP.x+10,BegP.y);
			Gra->MoveTo(BegP.x,BegP.y-10);	Gra->LineTo(BegP.x,BegP.y+10);
			Gra->MoveTo(BegP);	Gra->LineTo(PreP);
		break;
     case 4:
	    
	    BegP=point;PreP=BegP;
     	Gra->SetROP2(R2_XORPEN);
	    Gra->SelectObject(&CurPen);
        Gra->Ellipse(BegP.x-50,BegP.y+50,BegP.x+50,BegP.y-50);
	    Gra->MoveTo(BegP);
    	Gra->LineTo(PreP);
        TransScale(ratio);
		//PreP=point;
        break;

	case 5:
	 BegP=point;
	 if(PNum2==0)
	{
	 ContP2[PNum2++]=point;
	}
	else
	{
	BegP=ContP2[PNum2-1];
	}
	PreP=point;   
	Gra->SetROP2(R2_XORPEN);
	Gra->SelectObject(&OrgPen);  
	Gra->MoveTo(BegP.x-10,BegP.y);	Gra->LineTo(BegP.x+10,BegP.y);
	Gra->MoveTo(BegP.x,BegP.y-10);	Gra->LineTo(BegP.x,BegP.y+10);
	Gra->MoveTo(BegP);	Gra->LineTo(PreP);
		break;

     case 6:
	       BegP=point;PreP=BegP;
	       Gra->SetROP2(R2_XORPEN);
	       Gra->SelectObject(&OrgPen);  
	       Gra->MoveTo(BegP.x-10,BegP.y);	Gra->LineTo(BegP.x+10,BegP.y);
	       Gra->MoveTo(BegP.x,BegP.y-10);	Gra->LineTo(BegP.x,BegP.y+10);
		   Gra->MoveTo(BegP);
		   Gra->LineTo(BegP.x+200,BegP.y);
		   Gra->MoveTo(BegP);
		   Gra->LineTo(PreP);	      		   
		   TransRotation(angle);
		   PreP=point;
		  break;
	case 7:
		   BegP=point;PreP=BegP;
	       Gra->SetROP2(R2_XORPEN);
	       Gra->SelectObject(&OrgPen); 
		   TransMirror(PreP);
		   Gra->MoveTo(PreP.x-10,PreP.y);	Gra->LineTo(PreP.x+10,PreP.y);
	       Gra->MoveTo(PreP.x,PreP.y-10);	Gra->LineTo(PreP.x,PreP.y+10);
           PreP=point;
		   break;
    case 8:
		   BegP=point;PreP=BegP;
	       Gra->SetROP2(R2_XORPEN);
	       Gra->SelectObject(&OrgPen); 
		   Gra->MoveTo(PreP.x-600,PreP.y);
		   Gra->LineTo(PreP.x+600,PreP.y);
           TransXMirror(PreP);
		   PreP=point;
	       break;
	case 9:
		   BegP=point;PreP=BegP;
	       Gra->SetROP2(R2_XORPEN);
	       Gra->SelectObject(&OrgPen); 
		   Gra->MoveTo(PreP.x,PreP.y-600);
		   Gra->LineTo(PreP.x,PreP.y+600);
           TransYMirror(PreP);
		   PreP=point;
		   break;
		   
	case 10:
		   BegP=point;PreP=BegP;
	       Gra->SetROP2(R2_XORPEN);
	       Gra->SelectObject(&OrgPen); 
		  
	       Gra->MoveTo(BegP.x,BegP.y);	Gra->LineTo(BegP.x+500,BegP.y);
		   Gra->MoveTo(BegP.x+50,BegP.y);
	       Gra->LineTo(BegP.x+50,BegP.y+50);Gra->LineTo(BegP.x,BegP.y+50);
		   Gra->MoveTo(BegP.x,BegP.y+500); Gra->LineTo(BegP);
		   TransCuoQie(Hx,Hy);
		   PreP=point;
		   
		  break;  
		
		  
	}
	CView::OnLButtonDown(nFlags, point);
}
void CGraphicsAlgorithmView::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if(MouDown){
	switch(FunSel)
	{
	case 0:
		break;
	case 1:
		Gra->MoveTo(BegP);
		Gra->LineTo(PreP);
		PreP=point;		
		Gra->MoveTo(BegP);

		Gra->LineTo(PreP);
		break;
	case 2:
       
		Gra->MoveTo(BegP);
		Gra->LineTo(PreP);
        TransShift(PreP-BegP);
	    PreP=point;		
		Gra->MoveTo(BegP);
		Gra->LineTo(PreP);
		TransShift(PreP-BegP);
		break;
	case 3: 
		break;
	case 4:
     	Gra->MoveTo(BegP);
		Gra->LineTo(PreP);
        TransScale(ratio);
        PreP=point;
		Gra->MoveTo(BegP);
		Gra->LineTo(PreP);
		TransScale(ratio);      					
		break;

	case 5:
		
		Gra->MoveTo(BegP);
		Gra->LineTo(PreP);
		PreP=point;		
		Gra->MoveTo(BegP);
	    Gra->LineTo(PreP);	
			break;	
	case 6:
		Gra->MoveTo(BegP);
		Gra->LineTo(PreP);    
		TransRotation(angle);
		PreP=point;	
		Gra->MoveTo(BegP);
	    Gra->LineTo(PreP);
		TransRotation(angle);
        break;			       
	case 7:
        TransMirror(PreP);
        Gra->MoveTo(PreP.x-10,PreP.y);	Gra->LineTo(PreP.x+10,PreP.y);
	    Gra->MoveTo(PreP.x,PreP.y-10);	Gra->LineTo(PreP.x,PreP.y+10);
		PreP=point;	
        Gra->MoveTo(PreP.x-10,PreP.y);	Gra->LineTo(PreP.x+10,PreP.y);
	    Gra->MoveTo(PreP.x,PreP.y-10);	Gra->LineTo(PreP.x,PreP.y+10);
        TransMirror(PreP);
	    break;
	case 8:     
		Gra->MoveTo(PreP.x-600,PreP.y);
	    Gra->LineTo(PreP.x+600,PreP.y);
		TransXMirror(PreP);
		PreP=point;	
        BegP=point;
        Gra->MoveTo(PreP.x-600,PreP.y);
		Gra->LineTo(PreP.x+600,PreP.y);
        TransXMirror(PreP);
		break;
	case 9:
	    Gra->MoveTo(PreP.x,PreP.y-300);
		Gra->LineTo(PreP.x,PreP.y+300);
        TransYMirror(PreP);
    	PreP=point;	
        BegP=point;
	    Gra->MoveTo(PreP.x,PreP.y-300);
		Gra->LineTo(PreP.x,PreP.y+300);
	    TransYMirror(PreP);
        break;	
    case 10:  		   		 	 		
	       Gra->MoveTo(BegP);
		   Gra->LineTo(PreP); 		  		   	   		  		  
		   TransCuoQie(Hx,Hy);
		   PreP=point;
		   Gra->MoveTo(BegP);
		   Gra->LineTo(PreP); 
		   TransCuoQie(Hx,Hy);
			break;
		
	    			             		
	}
	}
	
	CView::OnMouseMove(nFlags, point);
}
void CGraphicsAlgorithmView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	int i;
	MouDown=false;
	switch(FunSel)
	{
	case 0:
			break;
	case 1:
		Gra->SetROP2(R2_XORPEN);
		Gra->MoveTo(BegP.x-10,BegP.y);Gra->LineTo(BegP.x+10,BegP.y);
		Gra->MoveTo(BegP.x,BegP.y-10);Gra->LineTo(BegP.x,BegP.y+10);
		Gra->MoveTo(BegP);Gra->LineTo(point);
		//	pen1.CreatePen(PS_SOLID,1,RGB(255,0,0));
		Gra->SetROP2(R2_COPYPEN);
		Gra->SelectObject(&CurPen);  
		Gra->MoveTo(BegP);
		Gra->LineTo(point);
	 	ContP[PNum++]=point;
	
		break;
	case 2:
		cls();
		Gra->SetROP2(R2_COPYPEN);
		TransShift(point-BegP);
		for( i=0;i<PNum;i++)
			ContP[i]=ContP[i]+point-BegP;
			break;
	case 3:
			Gra->SetROP2(R2_XORPEN);
			Gra->MoveTo(BegP.x-10,BegP.y);
			Gra->LineTo(BegP.x+10,BegP.y);
			Gra->MoveTo(BegP.x,BegP.y-10);
			Gra->LineTo(BegP.x,BegP.y+10);
			Gra->MoveTo(BegP);
			Gra->LineTo(PreP);
		//	pen1.CreatePen(PS_SOLID,1,RGB(255,0,0));
			Gra->SetROP2(R2_COPYPEN);
			Gra->SelectObject(&OrgPen);  
			Gra->MoveTo(BegP);
			Gra->LineTo(point);
			break;
    case 4:
		cls();
		Gra->SetROP2(R2_COPYPEN);
        TransScale(ratio);
		if((PreP.x-BegP.x)*(PreP.x-BegP.x)+(PreP.y-BegP.y)*(PreP.y-BegP.y)<0.5)
			return;
	    ratio=sqrt(1.0*(PreP.x-BegP.x)/50*(PreP.x-BegP.x)/50+(PreP.y-BegP.y)/50*(PreP.y-BegP.y)/50);
		for( i=0;i<PNum;i++)
		{
			  ContP[i].x=ContP[i].x*ratio+(1-ratio)*BegP.x;	 
			  ContP[i].y=ContP[i].y*ratio+(1-ratio)*BegP.y;
		}      
		break;	
	
	case 5:
		Gra->SetROP2(R2_XORPEN);
		Gra->MoveTo(BegP.x-10,BegP.y);Gra->LineTo(BegP.x+10,BegP.y);
		Gra->MoveTo(BegP.x,BegP.y-10);Gra->LineTo(BegP.x,BegP.y+10);
		Gra->MoveTo(BegP);Gra->LineTo(point);
	
		Gra->SetROP2(R2_COPYPEN);
		Gra->SelectObject(&CurPen);  
		Gra->MoveTo(BegP);
		Gra->LineTo(point);
	 	ContP2[PNum2++]=point;		
			break;
	case 6:
		cls();
		Gra->SetROP2(R2_COPYPEN);
       
		TransRotation(angle);
		for(i=0;i<PNum;i++)
		{ CPoint ctp[1000];
		  for(i=0;i<PNum;i++)
		  ctp[i]=ContP[i];
		  ContP[i].x=BegP.x+(ctp[i].x-BegP.x)*cos(angle)-(ctp[i].y-BegP.y)*sin(angle);
          ContP[i].y=BegP.y+(ctp[i].y-BegP.y)*cos(angle)+(ctp[i].x-BegP.x)*sin(angle);
		}
		break;
	case 7:
     	cls();
		Gra->SetROP2(R2_COPYPEN);
        TransMirror(PreP);
        for( i=0;i<PNum;i++)
		{
		   ContP[i].x=2*PreP.x-ContP[i].x;
		   ContP[i].y=2*PreP.y-ContP[i].y;
		}
	break;
		
	case 8:
		cls();
		Gra->SetROP2(R2_COPYPEN);
        TransXMirror(PreP);
        for( i=0;i<PNum;i++)
		{
		   ContP[i].y=2*PreP.y-ContP[i].y;
		}
	
		break;
	case 9:
		cls();
		Gra->SetROP2(R2_COPYPEN);
        TransYMirror(PreP);
        for( i=0;i<PNum;i++)
		{
		   ContP[i].x=2*PreP.x-ContP[i].x;
		}  
		
	    break;
	case 10:
		cls();
		Gra->SetROP2(R2_COPYPEN);       
        TransCuoQie(Hx,Hy);
	//  CPoint CP[1000];
	//	for(int i=0;i<PNum;i++)
	//	     CP[i]=ContP[i];
	//	for(i=0;i<PNum;i++)
	//	{   
		    
	//		ContP[i].x=CP[i].x+Hx*CP[i].y;
    //       ContP[i].y=CP[i].y+Hy*CP[i].x;
	//	}
		break;
	
	}
	CView::OnLButtonUp(nFlags, point);
}
void CGraphicsAlgorithmView::OnidFloodFilll4() 
{
	// TODO: Add your command handler code here
	FunSel=1;//四连通区域填充

}
void CGraphicsAlgorithmView::FloodFill4(CPoint SeedP, COLORREF FillColor, COLORREF BdColor)
{
	if((Gra->GetPixel(SeedP)!=FillColor)&&(Gra->GetPixel(SeedP)!=BdColor))
	{
		Gra->SetPixel(SeedP,FillColor);
		FloodFill4(SeedP+CPoint(1,0),  FillColor, BdColor);
	 	FloodFill4(SeedP-CPoint(1,0),  FillColor, BdColor);
		FloodFill4(SeedP+CPoint(0,1),  FillColor, BdColor);
		FloodFill4(SeedP-CPoint(0,1),  FillColor, BdColor);
	}
}
void CGraphicsAlgorithmView::OnidCurColor() 
{
	// TODO: Add your command handler code here
	CColorDialog cdlg;
	if(cdlg.DoModal()==IDOK)
	{
		Curcolor=cdlg.GetColor();
		CurPen.DeleteObject();
		CurPen.CreatePen(PS_SOLID,3,Curcolor);
	}	
}
void CGraphicsAlgorithmView::cls()
{
	CRect rc;
	GetClientRect(rc);
	Gra->FillSolidRect(rc,Gra->GetBkColor());
}

void CGraphicsAlgorithmView::OnidClear() 
{
	// TODO: Add your command handler code here
	FunSel=0;PNum=0;
	cls();
}

void CGraphicsAlgorithmView::OnidPolygon() 
{
	// TODO: Add your command handler code here
	FunSel=1;PNum=0;
}

void CGraphicsAlgorithmView::OnClose() 
{
	// TODO: Add your command handler code here
	//FunSel=5;
	if(PNum>0)
	{
		Gra->MoveTo(ContP[PNum-1]);
	 	Gra->LineTo(ContP[0]);
		ContP[PNum++]=ContP[0];
	}
	if(PNum2>0)
	{
		Gra->MoveTo(ContP2[PNum2-1]);
	 	Gra->LineTo(ContP2[0]);
		ContP2[PNum2++]=ContP2[0];
	}
}

void CGraphicsAlgorithmView::OnidFillColor() 
{

⌨️ 快捷键说明

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