吳老師有個很酷炫的彩虹跑馬燈板的範例,在請教他的邏輯思維設計之後,我也在不斷的嘗試下瞭解了整個運作的方式,今天就來與大家分享程式碼的流程
先看示範影片 。
簡單來說,我們都知道有跑馬燈的效果,但是今天跑馬的變化是針對「色相」做改變,所以我們希望做出一個變化很順、柔和的彩虹跑馬燈。
話不多說,馬上輸入https://www.easy-py.net/test/,開始編輯程式碼吧
首先,這是基礎的邏輯。色相相關的知識請看前面的文章,上圖程式碼完成之後,點選上排工具列執行,你就會看到8X8LED燈板上64個LED都同時點亮,並顯示色相為150的顏色,是一個靜止的畫面。
那如何同時改變64顆燈的顏色呢?
是不是只要將「di」這個變數放到色相的積木中,替代原本的150就可以了!64顆燈就會以1/30秒的速度變化,積木如下圖所示
接著,我就開始思考如何讓色彩產生流動的感覺?以直譯式的程式碼邏輯來說,64顆燈並不是同時被點亮,而是以x座標先開始,如果x = 1,y會跑1~8後再換x = 2時,y再跑1~8,這樣不斷地循序漸進的方式點燈,所以這邊有個很重要的觀念是:LED燈板本來就是以動態的方式再點亮64顆LED燈珠,只是時間太快(1/30秒)肉眼看不出來。
因此我只要去測試研究色相的部分就好,64顆燈本來就是要同時被點亮,只是顏色改變而已,並且希望是可以由我去控制改變的方向。
經果幾次的測試後,我歸納出幾個重點
上圖的積木中,我將x+di*1,其中di*1不就和di本身一樣麻,為何我要讓di特別去乘以1?
原因是如果di*(-1),方向就會和原本的相反!x就是水平位移的變量,最後面的乘以10則是為了要讓色相變化大一點,肉眼容易辨識,其結果如影片。
因此我可以歸納出數學式:(x+di*1)*10是一方向由右至左的水平位移彩虹變化,我也推出如果改為(x+di*(-1))*10時,方向就會相反。同理可證,我將x換成y時,彩虹的變化就由水平變為垂直
那我可不可以設計往斜向變化的彩虹?所以我就很直覺地將y改為x+y,試試看能不能得到一個斜向變化的彩虹,數學式:(x+y+di*(-1))*10,請觀看測試後的影片。
從影片得知我成功了!獲得一個可以從左上到右下做變化的彩虹
那倒底是為什麼會這樣?為什麼我只是在色相中新增x座標和y座標之後,就會產生出這種變化?
這讓我想到李連杰演過一部非常知名的武俠電影《倚天屠龍記之魔教教主》中,殷素素對張無忌說的:「越漂亮的女人,就越會騙人」的這句經典台詞。當你對燈板上變化中的彩虹執迷不悟時,你就陷入了他的陷阱中,其實從頭到尾64顆LED的順序都不是斜向的。
我刻意地把程式碼改成為下圖的方式,將di放在最內圈,強迫他只跑64次的變化,結果如影片。
如同我圈起來的部分,結果論來說只會看到顏色的分布「感覺」上是斜向的分布,所以當他開始捲動的時候,我們就會覺得它是斜向的變化,事實上,燈珠依然是垂直的點亮。
所以要聽媽媽的話,越漂亮越會騙人喔 XDDD
回到正題!
因此我可以得到上、下、左、右、左上到右下和右下到左上等方向變化
為了方便,我在初始化的地方多設定了幾個變數如下圖積木。
整體來說就是這樣,如果你希望讓顏色變化再揉合一點,那就把最後的乘以10改小一點!
希望大家玩得愉快囉!