天天看點

錯覺圖檔生成實驗 - 平行的線

(圖書介紹:童晶:《C和C++遊戲趣味程式設計》新書預告)

這學期的線下C語言課程,大一同學們學完旋轉蛇案例後(童晶:第4章 旋轉蛇(《C和C++遊戲趣味程式設計》配套教學視訊)),布置了一次錯覺圖檔生成實驗的PBL,給了大家5天時間分組完成代碼、ppt報告。

這次,介紹景駿飛、馮朦胧同學實作的平行的線。由于同學們學習C語言剛一個月,還沒有正式學習數組、函數等文法知識,是以代碼可能不夠完善。以下提供了分步驟的實作思路、代碼,大家可以參考。

首先是同學們調研的目标效果:

錯覺圖檔生成實驗 - 平行的線

交替的明暗方塊不直接與它們上方和下方的行上的方塊對齊。結果是每行之間的水準線看起來是傾斜的。實際上,這些水準線彼此之間是完全平行且筆直的。

錯覺原理

左氏錯覺:當兩個輪廓彼此接近時,它們在視網膜上的投影也彼此接近,由于視網膜上的神經細胞興奮産生視覺資訊時存在側抑制現象,即相鄰的感受細胞間存在互相抑制的現象,由輪廓所刺激的視細胞的活動被改變,使得神經興奮的中心發生了相對位移,進而引起幾何圖形形狀和方向的錯覺。

第一步:初步繪制不相連的方塊群

兩個for循環嵌套,内層循環繪制一列等距間隔的白色方塊和中間的灰色直線

錯覺圖檔生成實驗 - 平行的線
第二步:動态變換的實作

在上一步代碼的基礎上,清除畫布,再用兩個for循環的嵌套内引入變量來控制相鄰行内方塊的移動方向相反,進而實作方塊的交錯排布。

錯覺圖檔生成實驗 - 平行的線
第三步:視覺效果的完善

通過加入變量i來控制位移方向不同的方塊間隔的行數,更加接近原圖,使得錯覺效果更加明顯。

錯覺圖檔生成實驗 - 平行的線
最後,

把所有圖形繪制的代碼套入一個while死循環中,就能實作反複切換啦。

//最終版本,添加注釋
#include <graphics.h>
#include <conio.h>
#include <stdio.h>
int main()
{
	initgraph(760, 600);//打開一個760*600的視窗
	int left, top, right, bottom, length;//設定方塊相關坐标
	length = 40;//方塊邊長

	while (1)//死循環實作動态切換
	{
		for (left = 0; left < 800; left = left + 2 * length)
		{
			for (top = 0; top < 600; top = top + length)
			{
				//由左上坐标确定右下坐标
				right = left + length;
				bottom = top + length;
				//繪制灰色直線
				setlinecolor(RGB(140, 140, 140));
				line(0, top, 800, top);
				//繪制方塊
				setfillcolor(RGB(255, 255, 255));
				fillrectangle(left, top, right, bottom);
			}
		}
		_getch();
		cleardevice();//清空畫布
		//循環實作多個方塊規律性移動
		for (left = 0; left < 800; left = left + 2 * length)
		{
			int i = 0, t = -1;//引入循環變量
			left = left + t * length / 2;//方塊左右移動
			for (top = 0; top < 600; top = top + length)
			{
				if (i % 2 == 0)
					t = t * (-1);
				left = left + t * length / 2;
				right = left + length;
				bottom = top + length;
				setlinecolor(RGB(140, 140, 140));
				line(0, top, 800, top);//灰色直線			
				setfillcolor(RGB(255, 255, 255));
				fillrectangle(left, top, right, bottom);//白色方塊
				i++;
			}
		}
		_getch();
		cleardevice();
	}
	return 0;
}
           

繼續閱讀