错觉图片生成实验 - 椭圆的艺术

(图书介绍:童晶:《C和C++游戏趣味编程》新书预告

这学期的线下C语言课程,大一同学们学完旋转蛇案例后(童晶:第4章 旋转蛇(《C和C++游戏趣味编程》配套教学视频)),布置了一次错觉图片生成实验的PBL,给了大家5天时间分组完成代码、ppt报告。

这次,介绍许庄颜、陈悦同学实现的movement in elipse错觉。由于同学们学习C语言刚一个月,还没有正式学习数组、函数等语法知识,因此代码可能不够完善。以下提供了分步骤的实现思路、代码,大家可以参考。

首先是同学们调研的目标效果:

v2-f2448b4d4abefe22b7eef9c50eda03af_b.jpg

这种现象可称为“视错觉”,造成这种错觉的原因有两点:第一点是因为当你在看图片的时候,眼球有轻微的扰动;第二点是因为你的注视点和周边区域会有一定的差异。

这张图片由八行大小变化的椭圆组成,它们的长轴保持不变,但短轴慢慢变小,这些重复的结构和强烈的对比形成了某种光学错觉,提供了一种运动感。

1 绘制一行椭圆及画框

利用initgraph函数绘制画框,利用setbkcolor函数填充背景颜色为黄色。利用坐标轴和fillellipse函数绘制一行椭圆

v2-e337778557524cc34d89b15a7b54edf4_b.jpg

2 绘制完整一行椭圆及椭圆上异色线条

通过复制代码,修改数据绘制第一行完整的椭圆。利用arc、setlinestyle函数绘制椭圆上不同颜色的曲线。

v2-3f0a18b6b38c218e4e6082a9ffeac17b_b.jpg

3 利用HSVtoRGB调整背景颜色

调整参数,使背景颜色接近图片颜色

v2-015b6a5afd405240fa6c97d9812e8d19_b.jpg

4 利用for语句循环绘制多行椭圆

v2-e219e3662a93ba071db62aaf2caa3bf1_b.jpg
#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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值