(圖書介紹:童晶:《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;
}