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

📄 graphicsalgorithmview.cpp

📁 平面图形变换的源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	// TODO: Add your command handler code here
		CColorDialog cdlg;
	if(cdlg.DoModal()==IDOK)
	{
		FillColor=cdlg.GetColor();
	}

}
void CGraphicsAlgorithmView::OnidLineWidth() 
{
	// TODO: Add your command handler code here
		LWidth ldlg;
	//	ttt tlg;
	//	tlg.DoModal();
		ldlg.DoModal();
		CurPen.DeleteObject();
		CurPen.CreatePen(PS_SOLID,ldlg.m_LWidth,Curcolor);

}
void CGraphicsAlgorithmView::Onidabout() 
{
	// TODO: Add your command handler code here
	MessageBox(" 这个直接递归调用的填充程序在填充稍大的区域时容易出现意外,终止运行!");

}
void CGraphicsAlgorithmView::OnidTransShift() 
{
	// TODO: Add your command handler code here
		FunSel=2;

}
void CGraphicsAlgorithmView::TransShift(CPoint T)
{
   Gra->MoveTo(ContP[0]+T);
   for(int i=1;i<PNum;i++)
   {
 	Gra->LineTo(ContP[i]+T);
   }
}


void CGraphicsAlgorithmView::OnidTransScale() 
{
	// TODO: Add your command handler code here
	FunSel=4;
}

void CGraphicsAlgorithmView::OnidTransRotation() 
{
	// TODO: Add your command handler code here
    FunSel=6;
}

void CGraphicsAlgorithmView::TransScale(double ratio)
{
  
        double beg_x,beg_y,tt;

        beg_x=BegP.x;
        beg_y=BegP.y;
		tt=50;
		for(int i=0;i<PNum;i++)
		ScaMid[i]=ContP[i];
		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)/tt*(PreP.x-BegP.x)/tt+(PreP.y-BegP.y)/tt*(PreP.y-BegP.y)/tt);
	    ContP[0].x=(ScaMid[0].x*ratio+(1-ratio)*BegP.x);
        ContP[0].y=(ScaMid[0].y*ratio+(1-ratio)*BegP.y);
        Gra->MoveTo(ContP[0]);
    
        for( i=1;i<PNum;i++)
		{
		  ContP[i].x=(ScaMid[i].x*ratio+(1-ratio)*BegP.x);
		  ContP[i].y=(ScaMid[i].y*ratio+(1-ratio)*BegP.y);
          Gra->LineTo(ContP[i]);
		}  
	      Gra->LineTo(ContP[0]);

		for(i=0;i<PNum;i++)
			ContP[i]=ScaMid[i];
    

}
void CGraphicsAlgorithmView::TransRotation(double angle)
{

    double PI=3.1416;
    if((PreP.x>BegP.x)&&(PreP.y>=BegP.y))
	  angle=asin((PreP.y-BegP.y)/sqrt((PreP.x-BegP.x)*(PreP.x-BegP.x)+(PreP.y-BegP.y)*(PreP.y-BegP.y))) ;
	if((PreP.x<=BegP.x)&&(PreP.y>BegP.y))
      angle=PI-asin((PreP.y-BegP.y)/sqrt((PreP.x-BegP.x)*(PreP.x-BegP.x)+(PreP.y-BegP.y)*(PreP.y-BegP.y))) ;
	if((PreP.x<BegP.x)&&(PreP.y<=BegP.y))
      angle=PI-asin((PreP.y-BegP.y)/sqrt((PreP.x-BegP.x)*(PreP.x-BegP.x)+(PreP.y-BegP.y)*(PreP.y-BegP.y))) ;
	if((PreP.x>=BegP.x)&&(PreP.y<BegP.y))
	  angle=2*PI+asin((PreP.y-BegP.y)/sqrt((PreP.x-BegP.x)*(PreP.x-BegP.x)+(PreP.y-BegP.y)*(PreP.y-BegP.y))) ;
	if(sqrt((PreP.x-BegP.x)*(PreP.x-BegP.x)+(PreP.y-BegP.y)*(PreP.y-BegP.y))<0.5)
		return;
	CPoint ctp[1000];
	for(int i=0;i<PNum;i++)
		ctp[i]=ContP[i];
	ContP[0].x=BegP.x+(ctp[0].x-BegP.x)*cos(angle)-(ctp[0].y-BegP.y)*sin(angle);
    ContP[0].y=BegP.y+(ctp[0].y-BegP.y)*cos(angle)+(ctp[0].x-BegP.x)*sin(angle);
			
    Gra->MoveTo(ContP[0]); 
    for( i=1;i<PNum;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);
 	  Gra->LineTo(ContP[i]);
	 
	}
	  Gra->LineTo(ContP[0]);
	  	for(i=0;i<PNum;i++)
			ContP[i]=ctp[i];

}

void CGraphicsAlgorithmView::TransMirror(CPoint point)
{	CPoint ctp[1000];	
		for(int i=0;i<PNum;i++)
			ctp[i]=ContP[i];

	    ContP[0].x=2*PreP.x-ContP[0].x;
        ContP[0].y=2*PreP.y-ContP[0].y;
        Gra->MoveTo(ContP[0]);
    
    for( i=1;i<PNum;i++)
	{   
		ContP[i].x=2*PreP.x-ContP[i].x;
		ContP[i].y=2*PreP.y-ContP[i].y;
        Gra->LineTo(ContP[i]);
  
	}

        Gra->LineTo(ContP[0]);
    for(i=0;i<PNum;i++)
			ContP[i]=ctp[i];
}

void CGraphicsAlgorithmView::OnidTransDonghua1() 
{
	// TODO: Add your command handler code here
	    int k=2000;
	    CPoint FillPoly[2000];
		CPoint Rectangle[4];
		Rectangle[0].x=200;
        Rectangle[0].y=150;
	    Rectangle[1].x=300;
		Rectangle[1].y=150;
	    Rectangle[2].x=300;
		Rectangle[2].y=250;
		Rectangle[3].x=200;
		Rectangle[3].y=250;
		
	 for(int j=1;j<=k;j++)
	   {
	     FillPoly[0].x=j*(Rectangle[0].x-ContP[0].x)/k+ContP[0].x;
         FillPoly[0].y=j*(Rectangle[0].y-ContP[0].y)/k+ContP[0].y;
         Gra->MoveTo(FillPoly[0]); 
		for(int i=1;i<4;i++)
		 {    FillPoly[i].x=j*(Rectangle[i].x-ContP[i].x)/k+ContP[i].x;
              FillPoly[i].y=j*(Rectangle[i].y-ContP[i].y)/k+ContP[i].y;
              Gra->LineTo(FillPoly[i]);
		 }
	     for(i=4;i<PNum;i++)
			{
			 if(i%4==0)
			 {	 
			   FillPoly[i].x=j*(Rectangle[3].x-ContP[i].x)/k+ContP[i].x;
               FillPoly[i].y=j*(Rectangle[3].y-20-ContP[i].y)/k+ContP[i].y;
		       
			 }
             if(i%4==1)
			 {	 
			   FillPoly[i].x=j*(Rectangle[3].x-ContP[i].x)/k+ContP[i].x;
               FillPoly[i].y=j*(Rectangle[3].y-40-ContP[i].y)/k+ContP[i].y;
		      
			 }

             if(i%4==2)
			 {	 
			   FillPoly[i].x=j*(Rectangle[3].x-ContP[i].x)/k+ContP[i].x;
               FillPoly[i].y=j*(Rectangle[3].y-60-ContP[i].y)/k+ContP[i].y;
		       
			 }
             if(i%4==3)
			 {	 
			   FillPoly[i].x=j*(Rectangle[3].x-ContP[i].x)/k+ContP[i].x;
               FillPoly[i].y=j*(Rectangle[3].y-80-ContP[i].y)/k+ContP[i].y;
		       
			 }
             Gra->LineTo(FillPoly[i]);
			}
		    
		     Gra->LineTo(FillPoly[0]);
			 cls();
	 } 
        Gra->MoveTo(Rectangle[0]);
		Gra->LineTo(Rectangle[1]);
		Gra->LineTo(Rectangle[2]);
		Gra->LineTo(Rectangle[3]); 
        Gra->LineTo(Rectangle[0]);
			       
}		
	
void CGraphicsAlgorithmView::OnidTransXMirror() 
{
	// TODO: Add your command handler code here
    FunSel=8;	
}

void CGraphicsAlgorithmView::OnidTransYMirror() 
{
	// TODO: Add your command handler code here
	FunSel=9;
}

void CGraphicsAlgorithmView::OnidTransPMirror() 
{
	// TODO: Add your command handler code here
    FunSel=7;	
}

void CGraphicsAlgorithmView::OnidTansCuoqie() 
{
	// TODO: Add your command handler code here
  FunSel=10;  	
}

void CGraphicsAlgorithmView::TransXMirror(CPoint point)
{
	CPoint ctp[1000];	
		for(int i=0;i<PNum;i++)
			ctp[i]=ContP[i];

	    
        ContP[0].y=2*PreP.y-ContP[0].y;
        Gra->MoveTo(ContP[0]);
    
    for( i=1;i<PNum;i++)
	{   
	
		ContP[i].y=2*PreP.y-ContP[i].y;
        Gra->LineTo(ContP[i]);
  
	}

        Gra->MoveTo(ContP[0]);
    for(i=0;i<PNum;i++)
			ContP[i]=ctp[i];
}

void CGraphicsAlgorithmView::TransYMirror(CPoint point)
{
	CPoint ctp[1000];	
		for(int i=0;i<PNum;i++)
			ctp[i]=ContP[i];

	    ContP[0].x=2*PreP.x-ContP[0].x;
       
        Gra->MoveTo(ContP[0]);
    
    for( i=1;i<PNum;i++)
	{   
		ContP[i].x=2*PreP.x-ContP[i].x;
	
        Gra->LineTo(ContP[i]);
  
	}

        Gra->LineTo(ContP[0]);
    for(i=0;i<PNum;i++)
			ContP[i]=ctp[i];
}
void CGraphicsAlgorithmView::TransCuoQie(double Hx, double Hy)
{
       
		CPoint ctp[1000];       		
		for(int i=0;i<PNum;i++)
			ctp[i]=ContP[i];
  
    Hx=(PreP.y-BegP.y)/50.0; 
    Hy=(PreP.x-BegP.x)/50.0;
	ContP[0].x=ctp[0].x+Hy*ctp[0].y;
    ContP[0].y=ctp[0].y+Hx*ctp[0].x;
    Gra->MoveTo(ContP[0]);
    
    for( i=1;i<PNum;i++)
	{   
    ContP[i].x=ctp[i].x+Hy*ctp[i].y;
    ContP[i].y=ctp[i].y+Hx*ctp[i].x;
    Gra->LineTo(ContP[i]);
           
	}
    Gra->LineTo(ContP[0]);
		for(i=0;i<PNum;i++)
			ContP[i]=ctp[i];
  
}

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

void CGraphicsAlgorithmView::OnidSecPoly() 
{
	// TODO: Add your command handler code here
	FunSel=5;PNum2=0;
}

void CGraphicsAlgorithmView::OnidFirPicToSecPic() 
{
	// TODO: Add your command handler code here
		  int k=11000;
	      CPoint FillPoly[11000];
		  PNumFir=PNum;
          PNumSec=PNum2;
		  	Gra->SetROP2(R2_XORPEN);

    for(int j=1;j<k;j++)
	{
	       if(PNumFir=PNumSec)
		   {
	           FillPoly[0].x=j*(ContP2[0].x-ContP[0].x)/k+ContP[0].x;
               FillPoly[0].y=j*(ContP2[0].y-ContP[0].y)/k+ContP[0].y;
			   Gra->MoveTo(FillPoly[0]);
		     for(int i=1;i<PNum;i++)
			 {
			  FillPoly[i].x=j*(ContP2[i].x-ContP[i].x)/k+ContP[i].x;
              FillPoly[i].y=j*(ContP2[i].y-ContP[i].y)/k+ContP[i].y;
		      Gra->LineTo(FillPoly[i]);
			 }
		      Gra->LineTo(FillPoly[0]);
			 // cls();
		   }
	       if(PNumFir=PNumSec)
		   {
	           FillPoly[0].x=j*(ContP2[0].x-ContP[0].x)/k+ContP[0].x;
               FillPoly[0].y=j*(ContP2[0].y-ContP[0].y)/k+ContP[0].y;
			   Gra->MoveTo(FillPoly[0]);
		     for(int i=1;i<PNum;i++)
			 {
			  FillPoly[i].x=j*(ContP2[i].x-ContP[i].x)/k+ContP[i].x;
              FillPoly[i].y=j*(ContP2[i].y-ContP[i].y)/k+ContP[i].y;
		      Gra->LineTo(FillPoly[i]);
			 }
		      Gra->LineTo(FillPoly[0]);
			//  cls();
		   }
	       if(PNumFir>PNumSec)
		   {
		  
	           FillPoly[0].x=j*(ContP2[0].x-ContP[0].x)/k+ContP[0].x;
               FillPoly[0].y=j*(ContP2[0].y-ContP[0].y)/k+ContP[0].y;
			   Gra->MoveTo(FillPoly[0]);
		     for(int i=1;i<PNumSec;i++)
			 {
			  FillPoly[i].x=j*(ContP2[i].x-ContP[i].x)/k+ContP[i].x;
              FillPoly[i].y=j*(ContP2[i].y-ContP[i].y)/k+ContP[i].y;
		      Gra->LineTo(FillPoly[i]);
			 }
		     for(i=PNumSec;i<PNumFir;i++)
			 {
			  FillPoly[i].x=j*(ContP2[PNumSec].x-ContP[i].x)/k+ContP[i].x;
		      FillPoly[i].y=j*(ContP2[PNumSec].y-ContP[i].y)/k+ContP[i].y;
		      Gra->LineTo(FillPoly[i]);
			 }
		      Gra->LineTo(FillPoly[0]);
			  //cls();

		   }if(PNumFir>PNumSec)
		   {
		  
	           FillPoly[0].x=j*(ContP2[0].x-ContP[0].x)/k+ContP[0].x;
               FillPoly[0].y=j*(ContP2[0].y-ContP[0].y)/k+ContP[0].y;
			   Gra->MoveTo(FillPoly[0]);
		     for(int i=1;i<PNumSec;i++)
			 {
			  FillPoly[i].x=j*(ContP2[i].x-ContP[i].x)/k+ContP[i].x;
              FillPoly[i].y=j*(ContP2[i].y-ContP[i].y)/k+ContP[i].y;
		      Gra->LineTo(FillPoly[i]);
			 }
		     for(i=PNumSec;i<PNumFir;i++)
			 {
			  FillPoly[i].x=j*(ContP2[PNumSec].x-ContP[i].x)/k+ContP[i].x;
		      FillPoly[i].y=j*(ContP2[PNumSec].y-ContP[i].y)/k+ContP[i].y;
		      Gra->LineTo(FillPoly[i]);
			 }
		      Gra->LineTo(FillPoly[0]);
			  //cls();

		   }
	       if(PNumFir<PNumSec)
		   {
		    
	           FillPoly[0].x=(ContP2[0].x-ContP[0].x)/k+ContP[0].x;
               FillPoly[0].y=(ContP2[0].y-ContP[0].y)/k+ContP[0].y;
			   Gra->MoveTo(FillPoly[0]);
	         for(int i=1;i<PNumFir;i++)
			 {
			  FillPoly[i].x=j*(ContP2[i].x-ContP[i].x)/k+ContP[i].x;
              FillPoly[i].y=j*(ContP2[i].y-ContP[i].y)/k+ContP[i].y;
		      Gra->LineTo(FillPoly[i]);
			 }
		     for(i=PNumFir;i<PNumSec;i++)
			 {
			  FillPoly[i].x=j*(ContP2[i].x-ContP[PNumFir].x)/k+ContP[PNumFir].x;
		      FillPoly[i].y=j*(ContP2[i].y-ContP[PNumFir].y)/k+ContP[PNumFir].y;
		      Gra->LineTo(FillPoly[i]);
			 }
		      Gra->LineTo(FillPoly[0]);
             //cls();
		   }if(PNumFir<PNumSec)
		   {
		    
	           FillPoly[0].x=(ContP2[0].x-ContP[0].x)/k+ContP[0].x;
               FillPoly[0].y=(ContP2[0].y-ContP[0].y)/k+ContP[0].y;
			   Gra->MoveTo(FillPoly[0]);
	         for(int i=1;i<PNumFir;i++)
			 {
			  FillPoly[i].x=j*(ContP2[i].x-ContP[i].x)/k+ContP[i].x;
              FillPoly[i].y=j*(ContP2[i].y-ContP[i].y)/k+ContP[i].y;
		      Gra->LineTo(FillPoly[i]);
			 }
		     for(i=PNumFir;i<PNumSec;i++)
			 {
			  FillPoly[i].x=j*(ContP2[i].x-ContP[PNumFir].x)/k+ContP[PNumFir].x;
		      FillPoly[i].y=j*(ContP2[i].y-ContP[PNumFir].y)/k+ContP[PNumFir].y;
		      Gra->LineTo(FillPoly[i]);
			 }
		      Gra->LineTo(FillPoly[0]);
             //cls();
		   }
}
		   Gra->MoveTo(ContP2[0]);
		   for(int i=1;i<PNumSec;i++)
		   {
			   Gra->LineTo(ContP2[i]);
		   }
		   Gra->LineTo(ContP2[0]);
 
}

void CGraphicsAlgorithmView::OnidTransDongHua3() 
{
	// TODO: Add your command handler code here

        int k=1000;
	    CPoint FillPoly[1000];
		CPoint Rectangle[4];        
		Rectangle[0].x=400;
        Rectangle[0].y=150;
	    Rectangle[1].x=480;
		Rectangle[1].y=250;
	    Rectangle[2].x=400;
		Rectangle[2].y=350;
		Rectangle[3].x=320;
		Rectangle[3].y=250;		
	 for(int j=1;j<=k;j++)
	   {
		 if(PNum<4)
	     {
			FillPoly[0].x=j*(Rectangle[0].x-ContP[0].x)/k+ContP[0].x;
            FillPoly[0].y=j*(Rectangle[0].y-ContP[0].y)/k+ContP[0].y;
			Gra->MoveTo(FillPoly[0]); 
	        for(int i=1;i<4;i++)
			{
			 FillPoly[i].x=j*(Rectangle[i].x-ContP[i].x)/k+ContP[i].x;
             FillPoly[i].y=j*(Rectangle[i].y-ContP[i].y)/k+ContP[i].y;
		     Gra->LineTo(FillPoly[i]);
			}
		     Gra->MoveTo(FillPoly[0]);
		 }
		   if(PNum>=4)
		 {    
			   
			FillPoly[0].x=j*(Rectangle[0].x-ContP[0].x)/k+ContP[0].x;
            FillPoly[0].y=j*(Rectangle[0].y-ContP[0].y)/k+ContP[0].y;
			Gra->MoveTo(FillPoly[0]); 
			for(int i=1;i<4;i++)
			{
			 FillPoly[i].x=j*(Rectangle[i].x-ContP[i].x)/k+ContP[i].x;
             FillPoly[i].y=j*(Rectangle[i].y-ContP[i].y)/k+ContP[i].y;
		     Gra->LineTo(FillPoly[i]);
			}
	        for( i=4;i<PNum;i++)
			{
			 FillPoly[i].x=j*(Rectangle[3].x-ContP[i].x)/k+ContP[i].x;
             FillPoly[i].y=j*(Rectangle[3].y-ContP[i].y)/k+ContP[i].y;
		     Gra->LineTo(FillPoly[i]);
			}
	
		     Gra->LineTo(FillPoly[0]);
		   }
	        cls();
		
	}
		Gra->MoveTo(Rectangle[0]);
		Gra->LineTo(Rectangle[1]);
		Gra->LineTo(Rectangle[2]);
		Gra->LineTo(Rectangle[3]); 
        Gra->LineTo(Rectangle[0]);			
}

void CGraphicsAlgorithmView::OnidCrossBar() 
{
	// TODO: Add your command handler code here

	    CPoint FillPoly[1000];
		CPoint CrossBar[12];
        int k=1000;
		CrossBar[0].x=400;CrossBar[0].y=200;
	    CrossBar[1].x=430;CrossBar[1].y=200;
		CrossBar[2].x=430;CrossBar[2].y=230;
	    CrossBar[3].x=460;CrossBar[3].y=230;
		CrossBar[4].x=460;CrossBar[4].y=260;
        CrossBar[5].x=430;CrossBar[5].y=260;
	    CrossBar[6].x=430;CrossBar[6].y=330;
		CrossBar[7].x=400;CrossBar[7].y=330;
		CrossBar[8].x=400;CrossBar[8].y=260;
	    CrossBar[9].x=370;CrossBar[9].y=260;
		CrossBar[10].x=370; CrossBar[10].y=230;
	   	CrossBar[11].x=400;CrossBar[11].y=230;					   	   				  
	  for(int j=1;j<=k;j++)
	  {   	

		   FillPoly[0].x=j*(CrossBar[0].x-ContP[0].x)/k+ContP[0].x;
           FillPoly[0].y=j*(CrossBar[0].y-ContP[0].y)/k+ContP[0].y;
		   Gra->MoveTo(FillPoly[0]);
		 if(PNum<12)
	     {
	        for(int i=1;i<PNum;i++)
			{
			 FillPoly[i].x=j*(CrossBar[i].x-ContP[i].x)/k+ContP[i].x;
             FillPoly[i].y=j*(CrossBar[i].y-ContP[i].y)/k+ContP[i].y;
		     Gra->LineTo(FillPoly[i]);
			}
			for( i=PNum;i<12;i++)
			{
			 FillPoly[i].x=j*(CrossBar[i].x-ContP[PNum-1].x)/k+ContP[PNum-1].x;
             FillPoly[i].y=j*(CrossBar[i].y-ContP[PNum-1].y)/k+ContP[PNum-1].y;
		     Gra->LineTo(FillPoly[i]);
			}
		     Gra->MoveTo(FillPoly[0]);
		 }
		   if(PNum>=12)
		   {    			 
			for(int i=1;i<12;i++)
			{
			 FillPoly[i].x=j*(CrossBar[i].x-ContP[i].x)/k+ContP[i].x;
             FillPoly[i].y=j*(CrossBar[i].y-ContP[i].y)/k+ContP[i].y;
		     Gra->LineTo(FillPoly[i]);
			}
	        for( i=12;i<PNum;i++)
			{
			 FillPoly[i].x=j*(CrossBar[11].x-ContP[i].x)/k+ContP[i].x;
             FillPoly[i].y=j*(CrossBar[11].y-ContP[i].y)/k+ContP[i].y;
		     Gra->LineTo(FillPoly[i]);
			}
	
		     Gra->LineTo(FillPoly[0]);					   
		   }
	   cls();
		
	}
	     Gra->MoveTo(CrossBar[0]);
		 for(int i=1;i<12;i++)
		{
		  Gra->LineTo(CrossBar[i]);
		}						
       	  Gra->LineTo(CrossBar[0]);
		
}



⌨️ 快捷键说明

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