若a≠d,则x,y坐标按各自不同比例变换。
3.3旋转变换
设图形上一点P(x,y)绕原点逆时针旋转θ角后成为新的图形上一点P'(x',y'),则由解析几何方法可得
x'=xcosθ+ysinθ
y'=-xsinθ+ycosθ
用矩阵表示为
这里
为绕原点逆时针变换矩阵。
若顺时针旋转时,θ角为负值。
4设计实现
4.1加载页面
voidheard()//开始界面
{
inti;
printf("\n\n\n\n");
printf("程序加载中\n\n");
printf("");
Sleep(1000);//延时
for(i=0;i<35;i++)
{
printf(">");
Sleep(60);
}
Sleep(1000);//延时
system("cls");//清屏
printf("\n\n\n\n");
printf("\a\a");//一声响声
printf("→【加载完成】");
system("pause");//dos命令
system("cls");//清屏
fflush(stdin);//清除缓冲区
}
4.2画出三角形,并对三角形的三种变换进行选择
voidsanjiao()//画三角形
{
initgraph(500,500);
line(25,50,50,50);
line(50,50,50,25);
line(50,25,25,50);
getch();//按任意键继续
closegraph();//关闭图形界面
}
voidsanjiaobianhuan()
{
intselsect;
do{
printf("\n\n");
printf("1.平移转换\t2.比例转换\n");
printf("3.旋转转换\t0.结束函数\n");
printf("\n\n");
printf("请输入你的选择:
");
scanf("%d",&selsect);
switch(selsect){
case0:
break;
case1:
pingyi_tu();break;
case2:
bili_tu();break;
case3:
xuanzhuan_tu();break;
}
}while(selsect!
=0);
}
4.3对三角形进行平移变换
voidpingyi_tu()//三角形平移变换
{
intTx,Ty;
intx1,x2,x3,y1,y2,y3;
inta,b,c,d,e,f;
printf("请输入平移的量为(Tx,Ty):
");
scanf("%d,%d",&Tx,&Ty);
//moverel(Tx,Ty);
printf("即要平移的量为:
(%d,%d)\n",Tx,Ty);
x1=25+Tx;y1=50+Ty;
x2=50+Tx;y2=25+Ty;
x3=50+Tx;y3=50+Ty;
initgraph(500,500);//初始化绘图环境
line(25,50,50,50);
line(50,50,50,25);
line(50,25,25,50);
Sleep(1000);
for(a=25,c=50,e=50;a<=Tx,c<=Tx,e<+Tx;a++,c++,e++)
{
setcolor(RGB(255,255,255));
line(a,50,c,50);
line(c,50,e,25);
line(e,25,a,50);
Sleep(10);
setcolor(RGB(0,0,0));
line(a,50,c,50);
line(c,50,e,25);
line(e,25,a,50);
}
for(b=50,d=50,f=25;b<=Ty,d<=Ty,f<=Ty;b++,d++,f++)
{
setcolor(RGB(255,255,255));
line(a,b,c,d);
line(c,d,e,f);
line(e,f,a,b);
Sleep(10);
setcolor(RGB(0,0,0));
line(a,b,c,d);
line(c,d,e,f);
line(e,f,a,b);
}
setcolor(RGB(255,255,255));
line(25,50,50,50);
line(50,50,50,25);
line(50,25,25,50);
setcolor(RGB(255,0,0));
line(a,b,c,d);
line(c,d,e,f);
line(e,f,a,b);
getch();
closegraph();//函数用于关闭图形环境。
}
4.4对三角形进行比例变换
voidbili_tu()//三角形比例变换
{
intSx,Sy;
intx1,x2,x3,y1,y2,y3;
printf("请输入比例的量为(Sx,Sy):
");
scanf("%d,%d",&Sx,&Sy);
printf("即要按比例转换的量为:
(%d,%d)\n",Sx,Sy);
x1=25*Sx;y1=50*Sy;
x2=50*Sx;y2=50*Sy;
x3=50*Sx;y3=25*Sy;
initgraph(500,500);//初始化绘图环境
line(25,50,50,50);
line(50,50,50,25);
line(50,25,25,50);
Sleep(1000);
setcolor(RGB(255,0,0));
line(x1,y1,x2,y2);
line(x1,y1,x3,y3);
line(x2,y2,x3,y3);
getch();//延时
closegraph();//函数用于关闭图形环境
}
4.5对三角形进行旋转变换
voidxuanzhuan_tu()//三角形旋转变换
{
inta;
intx1,x2,x3,y1,y2,y3;
printf("请输入要旋转的弧度制:
");
scanf("%d",&a);
x1=(int)(25*cos(a)-50*sin(a));y1=(int)(25*sin(a)+50*cos(a));
x2=(int)(50*cos(a)-50*sin(a));y2=(int)(50*sin(a)+50*cos(a));
x3=(int)(50*cos(a)-25*sin(a));y3=(int)(50*sin(a)+25*cos(a));
initgraph(500,500);//初始化绘图环境
line(25,50,50,50);
line(50,50,50,25);
line(50,25,25,50);
Sleep(1000);
setcolor(RGB(255,0,0));
line(x1,y1,x2,y2);
line(x1,y1,x3,y3);
line(x2,y2,x3,y3);
getch();//延时
closegraph();//函数用于关闭图形环境
}
4.6画出所要的矩形,并对选择需要的变换
voidjuxing()//画矩形
{
initgraph(500,500);
line(25,25,25,50);
line(25,50,60,50);
line(60,50,60,25);
line(60,25,25,25);
getch();
closegraph();
}
voidjuxingbianhuan()//矩形变换
{
intselsect;
do{
printf("\n\n");
printf("1.平移转换\t2.比例转换\n");
printf("3.旋转转换\t0.结束函数\n");
printf("\n\n");
printf("请输入你的选择:
");
scanf("%d",&selsect);
switch(selsect){
case0:
break;
case1:
pingyitu();break;
case2:
bilitu();break;
case3:
xuanzhuantu();break;
}
}while(selsect!
=0);
}
4.7矩形进行平移变换
voidpingyitu()//矩形平移变换
{
intTx,Ty;
inta,b,c,d;
intx1,x2,x4,x3,y1,y2,y3,y4;
printf("请输入平移的量(Tx,Ty):
");
scanf("%d,%d",&Tx,&Ty);
x1=25+Tx;y1=25+Ty;
x2=25+Tx;y2=50+Ty;
x3=60+Tx;y3=50+Ty;
x4=60+Tx;y4=25+Ty;
initgraph(500,500);//初始化绘图环境
line(25,25,25,50);
line(25,50,60,50);
line(60,50,60,25);
line(60,25,25,25);
Sleep(1000);
for(a=25,c=60;a<=x1,c<=x3;a++,c++)
{
setcolor(RGB(255,255,255));
line(a,25,a,50);
line(a,50,c,50);
line(c,50,c,25);
line(c,25,a,25);
Sleep(10);
setcolor(RGB(0,0,0));
line(a,25,a,50);
line(a,50,c,50);
line(c,50,c,25);
line(c,25,a,25);
}
for(b=25,d=50;c<=y1,d<=y3;b++,d++)
{
setcolor(RGB(255,255,255));
line(a,b,a,d);
line(a,d,c,d);
line(c,d,c,b);
line(c,b,a,b);
Sleep(10);
setcolor(RGB(0,0,0));
line(a,b,a,d);
line(a,d,c,d);
line(c,d,c,b);
line(c,b,a,b);
}
setcolor(RGB(255,255,255));
line(25,25,25,50);
line(25,50,60,50);
line(60,50,60,25);
line(60,25,25,25);
setcolor(RGB(255,0,0));
line(x1,y1,x2,y2);
line(x2,y2,x3,y3);
line(x3,y3,x4,y4);
line(x4,y4,x1,y1);
getch();//延时
closegraph();//函数用于关闭图形环境
}
4.8矩形进行比例变换
voidbilitu()//矩形比例变换
{
intSx,Sy;
intx1,x2,x3,x4,y1,y2,y3,y4;
x1=x2=x3=x4=y1=y2=y3=y4=0;
printf("请输入比例的量为(Sx,Sy):
");
scanf("%d,%d",&Sx,&Sy);
printf("即要按比例转换的量为:
(%d,%d)\n",Sx,Sy);
x1=25*Sx;y1=25*Sy;
x2=25*Sx;y2=50*Sy;
x3=60*Sx;y3=50*Sy;
x4=60*Sx;y4=25*Sy;
initgraph(500,500);//初始化绘图环境
line(25,25,25,50);
line(25,50,60,50);
line(60,50,60,25);
line(60,25,25,25);
Sleep(1000);
line(x1,y1,x2,y2);
line(x1,y1,x4,y4);
line(x2,y2,x3,y3);
line(x3,y3,x4,y4);
getch();//延时
closegraph();//函数用于关闭图形环境
}
4.9矩形进行旋转变换
voidxuanzhuantu()//矩形旋转变换
{
inta;
intx1,x2,x3,y1,y2,y3,x4,y4;
printf("请输入要旋转的弧度制:
");
scanf("%d",&a);
x1=(int)(25*cos(a)-25*sin(a));y1=(int)(25*sin(a)+25*cos(a));
x2=(int)(25*cos(a)-50*sin(a));y2=(int)(25*sin(a)+50*cos(a));
x3=(int)(60*cos(a)-50*sin(a));y3=(int)(60*sin(a)+50*cos(a));
x4=(int)(60*cos(a)-25*sin(a));y4=(int)(60*sin(a)+25*cos(a));
initgraph(500,500);//初始化绘图环境
line(25,25,25,50);
line(25,50,60,50);
line(60,50,60,25);
line(60,25,25,25);
Sleep(1000);
setcolor(RGB(255,0,0));
line(x1,y1,x2,y2);
line(x1,y1,x4,y4);
line(x2,y2,x3,y3);
line(x3,y3,x4,y4);
getch();//延时
closegraph();//函数用于关闭图形环境
}
4.10圆对圆形进行变换选择
voidyuan()//画圆
{
initgraph(500,500);
circle(250,250,50);
getch();
closegraph();
}
voidyuanbianhuan()//圆变换
{
intselsect;
do{
printf("\n\n");
printf("1.平移转换\n");
printf("2.比例变换\n");
printf("0.退出\n");
printf("\n\n");
printf("请输入你的选择:
");
scanf("%d",&selsect);
switch(selsect){
case0:
break;
case1:
yuanpingyi();break;
case2:
yuanbili();break;
}
}while(selsect!
=0);
}
4.11画出的圆形进行平移
voidyuanpingyi()//圆平移
{
intTx,Ty;
intx,y;
inti,j;
printf("请输入平移的量(x,y):
");
scanf("