📄 graphicsalgorithmview.cpp
字号:
// 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 + -