(图书介绍:童晶:《C和C++游戏趣味编程》新书预告)
这学期的线下C语言课程,大一同学们学完旋转蛇案例后(童晶:第4章 旋转蛇(《C和C++游戏趣味编程》配套教学视频)),布置了一次错觉图片生成实验的PBL,给了大家5天时间分组完成代码、ppt报告。
这次,介绍许庄颜、陈悦同学实现的movement in elipse错觉。由于同学们学习C语言刚一个月,还没有正式学习数组、函数等语法知识,因此代码可能不够完善。以下提供了分步骤的实现思路、代码,大家可以参考。
首先是同学们调研的目标效果:
这种现象可称为“视错觉”,造成这种错觉的原因有两点:第一点是因为当你在看图片的时候,眼球有轻微的扰动;第二点是因为你的注视点和周边区域会有一定的差异。
这张图片由八行大小变化的椭圆组成,它们的长轴保持不变,但短轴慢慢变小,这些重复的结构和强烈的对比形成了某种光学错觉,提供了一种运动感。
1 绘制一行椭圆及画框
利用initgraph函数绘制画框,利用setbkcolor函数填充背景颜色为黄色。利用坐标轴和fillellipse函数绘制一行椭圆
2 绘制完整一行椭圆及椭圆上异色线条
通过复制代码,修改数据绘制第一行完整的椭圆。利用arc、setlinestyle函数绘制椭圆上不同颜色的曲线。
3 利用HSVtoRGB调整背景颜色
调整参数,使背景颜色接近图片颜色
4 利用for语句循环绘制多行椭圆
#include<conio.h>
#include<stdio.h>
#include<graphics.h>
int main()
{
COLORREF color;
float H=220;
float S=0.5;
float L=0.5;
float pi=3.14;
int left,right,top=15,bottom,step=4;
int a=60,b=8;//长轴与短轴
bottom=top+a;
int i,d;//行数,行据
d=a+20;
// 初始化绘图窗口
initgraph(908, 800);
setbkcolor(HSVtoRGB(58,0.8,0.8));// 用背景色清空屏幕
cleardevice();
for (top=15;top<500;top=top+a+20)
{
left=2;
right=left+b;
bottom=top+a;
color=HSVtoRGB(H,S,L);//HSV设置的颜色
setfillcolor(color);//设置填充颜色为color
setlinecolor(BLACK);
setlinestyle(PS_SOLID | PS_JOIN_BEVEL, 2.5);
fillellipse(left,top,right,bottom);
setlinecolor(WHITE);
setlinestyle(PS_SOLID | PS_JOIN_BEVEL, 3);
arc(left,top,right,bottom,pi/2*3,pi/2);
for (b=12;b<=20;b=b+4)//1
{
left=right+step;
right=left+b+step;
step=b+10;
bottom=top+a;
color=HSVtoRGB(H,S,L);//HSV设置的颜色
setfillcolor(color);//设置填充颜色为color
setlinecolor(BLACK);
setlinestyle(PS_SOLID | PS_JOIN_BEVEL, 2.5);
fillellipse(left,top,right,bottom);
setlinecolor(WHITE);
setlinestyle(PS_SOLID | PS_JOIN_BEVEL, 3);
arc(left,top,right,bottom,pi/2*3,pi/2);
}
for (b=20;b>=8;b=b-4)//1
{
left=right+step;
right=left+b+step;
step=b-10;
bottom=top+a;
color=HSVtoRGB(H,S,L);//HSV设置的颜色
setfillcolor(color);//设置填充颜色为color
setlinecolor(BLACK);
setlinestyle(PS_SOLID | PS_JOIN_BEVEL, 2.5);
fillellipse(left,top,right,bottom);
setlinecolor(WHITE);
setlinestyle(PS_SOLID | PS_JOIN_BEVEL, 3);
arc(left,top,right,bottom,pi/2*3,pi/2);
}
right=right+4;//略微间隔开来
for (b=12;b<=20;b=b+4)//2
{
left=right+step;
right=left+b+step;
step=b+10;
bottom=top+a;
setfillcolor(color);//设置填充颜色为color
setlinecolor(BLACK);
setlinestyle(PS_SOLID | PS_JOIN_BEVEL, 2.5);
fillellipse(left,top,right,bottom);
setlinecolor(WHITE);
setlinestyle(PS_SOLID | PS_JOIN_BEVEL, 3);
arc(left,top,right,bottom,pi/2,pi/2*3);
}
for (b=20;b>=8;b=b-4)//2
{
left=right+step;
right=left+b+step;
step=b-10;
bottom=top+a;
color=HSVtoRGB(H,S,L);//HSV设置的颜色
setfillcolor(color);//设置填充颜色为color
setlinecolor(BLACK);
setlinestyle(PS_SOLID | PS_JOIN_BEVEL, 2.5);
fillellipse(left,top,right,bottom);
setlinecolor(WHITE);
setlinestyle(PS_SOLID | PS_JOIN_BEVEL, 3);
arc(left,top,right,bottom,pi/2,pi/2*3);
}
right=right+4;//略微间隔开来
for (b=12;b<=20;b=b+4)//3
{
left=right+step;
right=left+b+step;
step=b+10;
bottom=top+a;
color=HSVtoRGB(H,S,L);//HSV设置的颜色
setfillcolor(color);//设置填充颜色为color
setlinecolor(BLACK);
setlinestyle(PS_SOLID | PS_JOIN_BEVEL, 2.5);
fillellipse(left,top,right,bottom);
setlinecolor(WHITE);
setlinestyle(PS_SOLID | PS_JOIN_BEVEL, 3);
arc(left,top,right,bottom,pi/2*3,pi/2);
}
for (b=20;b>=8;b=b-4)//3
{
left=right+step;
right=left+b+step;
step=b-10;
bottom=top+a;
color=HSVtoRGB(H,S,L);//HSV设置的颜色
setfillcolor(color);//设置填充颜色为color
setlinecolor(BLACK);
setlinestyle(PS_SOLID | PS_JOIN_BEVEL, 2.5);
fillellipse(left,top,right,bottom);
setlinecolor(WHITE);
setlinestyle(PS_SOLID | PS_JOIN_BEVEL, 3);
arc(left,top,right,bottom,pi/2*3,pi/2);
}
}
_getch();
closegraph();
}
总结体会:学会了团队协作的重要性,代码敲不出的时候互相鼓励再不断的调试中才能ac。