(图书介绍:童晶:《C和C++游戏趣味编程》新书预告)
这学期的线下C语言课程,大一同学们学完旋转蛇案例后(童晶:第4章 旋转蛇(《C和C++游戏趣味编程》配套教学视频)),布置了一次错觉图片生成实验的PBL,给了大家5天时间分组完成代码、ppt报告。
这次,介绍许万亿、詹坤阳、田强、史秋实同学实现的动态缪勒莱尔错觉。由于同学们学习C语言刚一个月,还没有正式学习数组、函数等语法知识,因此代码可能不够完善。以下提供了分步骤的实现思路、代码,大家可以参考。
首先是同学们调研的目标效果:

最终实现效果:
错觉原理:

第一步:绘制蓝线及红线

#include<stdio.h>
#include<graphics.h>
#include<conio.h>
int i,j;
//函数声明;
void blueline();
void redline();
int main()
{
initgraph(640,540);//制表
setbkcolor(WHITE);//设为白色背景
BeginBatchDraw();//开始批量绘制;
while(1){
cleardevice();
blueline();//引用函数
redline();//引用函数
FlushBatchDraw();//批量绘制
Sleep(40);
}
_getch();
closegraph();
return 0;
}
void blueline(){
float line1x=35.5,line1y=45;//蓝线参数;
float x=line1x,y=line1y;
int i;
setlinestyle(PS_SOLID,3);//线宽为3
setlinecolor(LIGHTBLUE);//颜色为蓝
line(line1x,line1y,line1x,line1y+450);//绘蓝线
for (i=1;i<17;i++)//循环绘出所有蓝线
{
x=x+35.5;
line(x,y,x,y+450);
}
}
void redline(){
float line2x=35.5,line2y=135;//红线参数;
float x=line2x, y=line2y;
int i;
setlinestyle(PS_SOLID,3);//线宽为3
setlinecolor(RED);//颜色为红
line(line2x,line2y,line2x,line2y+90);//绘上红线
line(line2x,line2y+180,line2x,line2y+270);//绘下红线
for (i=1;i<17;i++)//循环绘出所有红线;
{
x=x+35.5;
line(x,y,x,y+90);
line(x,y+180,x,y+270);
}
}
第二步:使一根黑线运动
#include<stdio.h>
#include<graphics.h>
#include<conio.h>
//定义全局变量
int i,j;
//函数声明;
void blueline();
void redline();
int main()
{
initgraph(640,540);//制表
setbkcolor(WHITE);//设为白色背景
BeginBatchDraw();//开始批量绘制;
float v1=1.5;//储存黑线1的速度
float x1=35.5,x2=18.5,y1=45,y2=35; //黑线1参数;
while(1){
cleardevice();
blueline();//引用函数
redline();//引用函数
setlinestyle(PS_SOLID,3);
setlinecolor(BLACK);
line(x1,y1,x2,y2);
line(x1,y1,x2+34,y2);
y2=y2+v1;//实现黑线的运动
if(y2>32+26||y2<32){
v1=-v1;
}
FlushBatchDraw();//批量绘制
Sleep(40);
}
_getch();
closegraph();
return 0;
}
void blueline(){
float line1x=35.5,line1y=45;//蓝线参数;
float x=line1x,y=line1y;
int i;
setlinestyle(PS_SOLID,3);//线宽为3
setlinecolor(LIGHTBLUE);//颜色为蓝
line(line1x,line1y,line1x,line1y+450);//绘蓝线
for (i=1;i<17;i++)//循环绘出所有蓝线
{
x=x+35.5;
line(x,y,x,y+450);
}
}
void redline(){
float line2x=35.5,line2y=135;//红线参数;
float x=line2x, y=line2y;
int i;
setlinestyle(PS_SOLID,3);//线宽为3
setlinecolor(RED);//颜色为红
line(line2x,line2y,line2x,line2y+90);//绘上红线
line(line2x,line2y+180