Scratch編程之圖形特效(2)一花一世界,編程的世界很大很奇蹟(上)
有人喜歡玫瑰,因為象徵愛情,代表浪漫。
有人喜歡荷花,因為象徵廉潔,出淤泥而不染。
有人喜歡梅花,因為孤傲,且不耐嚴寒。
有人喜歡牡丹,因為妖嬈多姿,典雅不凡。
而MrCode最喜歡什麼花呢?
大概和小朋友一樣,最喜歡的是別人拿出一疊錢,說道:隨便花!
好吧,隨便花自然是幻想,但是我們不妨將這個幻想,用編程的方式畫出來吧。
今天,MrCode將帶著大家花四個不同的花:
一個是靜態的蓮花,
一個極具科幻效果的可以自己設定效果旋轉的交集花;
一個是有著抽象意義裝飾效果的玫瑰;
最後一個是我們冬天才能見到的雪花;
今天的課程有點難,但是在閃閃紅星的課程後,我們還是有理由相信自己可以做出特效的花。
好了,我們開始第一個花,蓮花。
先看蓮花,有一些什麼特點。
蓮花,首先她的美食大片綠葉襯托出來的。
其次,她的花瓣特別多,且有多個層次,顏色一般以中心花蕾最鮮艷。
所以畫蓮花的時候,我們先要花畫一個底色來襯托她。
然後一層層地描花瓣,色澤度要遞增。
這個過程會非常慢。
我們先創建一個角色,用來畫托盤。
托盤,選擇圓形,比較可以襯托花瓣。
這樣,我們的第一個目標,就是畫一個實心漸變色的圓。
我先學習,如何用scratch畫一個圓圈。
一個圓圈,可以被看成是360個點組成的,每個點移動一度的位置即可。
所以,用以下代碼就可以畫一個圓圈了。
然而,如果我們期望代碼執行更加高效,是不可能一個點一個點來畫的。
如果想做到上面圓圈的循環效果。
我們需要用到2個變數。
一個變數,是半徑 ,我們取名為半徑。
一個變數,是移動的角度 ,我們取名為角度。
我們可以使用函數sin,cos。
通過函數計算方式,圓點的坐標位置
橫軸x=半徑*sin(角度)
縱軸x=半徑*cos(角度)
那麼在Scratch里,就可以這樣寫。
從一個大圈開始畫,不斷減少半徑,直到半徑小於0.
就可以循環畫亮度不斷降低的圓圈,最後形成一個圓盤。
畫完圓圈後,我們就開始畫花瓣了。
在這裡,我們可以設定一個變數,選擇可以控制多少個花瓣。
當然,也可以使用對話的方式,詢問畫多少個花瓣。
例如:
這樣,我們獲取的變數值,就可以直接作為畫蓮花的參數進行輸入了。
例如,我們輸入5,那麼畫出來的就是5個花瓣。
那麼我們如何根據變數進行調整呢?
因為一個圈是360度,那麼畫5個花瓣,算下來的兩個花瓣之間的角度就是360/5=72度。
同理,花瓣設置為其他個數,每個花瓣之間內徑角度就不同了。
例如輸入兩個花瓣。
兩個花瓣之間的角度就是180度。
如果更多,角度就重合了。
那麼根據我們之前學習如何畫圓盤的理論,只要先畫出一個花瓣,再不斷移動,然後減少花瓣的長度,就可以畫出色彩分明的花瓣。
我們先學習如何畫一個花瓣。
花瓣的畫法可以分為左右兩邊對稱。
即我讓畫筆移動畫出一個弧形,再轉動90度,再畫一個一樣的弧形,就形成了花瓣。(由於畫筆在滑動過程中,已經轉了90度,所以形成對稱)
那麼我們只需要設計一個弧形,讓畫筆循環移動,即每移動N步,就旋轉一個角度。循環下來,弧形就出來了。(有點類似我們前面講如何畫圓的概念)
具體代碼可以是:
這樣,隨著C的減少,亮度的增加。
我們的花瓣色澤就變得鮮明了。
下面,我們介紹如何畫一個有科幻效果的花。
因為有人說,老師,蓮花雖然畫好了,但是沒有動。
好吧,這次我們把花放到星空,我們來畫一個可以動的花。
不僅僅可以懂,花的大小,顏色,旋轉方式都是可以調節的哦!
現在,我們一起開始吧。
首先,我們想達到的效果,因為是變化的,就需要幾個變數。
表現色彩的變數 color
表現整體大小的變數,sizex,sizey
表現花瓣的個數,petals
表現旋轉的速度,speed
接下來,由於我們需要找到畫筆的位置,所以在程序中,需要增加兩個,用戶不能控制的變數,x,y,作為畫筆的橫縱軸的需要移動位置。
於是乎,我們就可以動態定義出一個有科幻效果的花。
畫花的思路,其實和上一個圖差不多。但是我們需要動起來。
所以如果花瓣變成實心的,程序處理周期就長了。
所以我們的科幻效果,就是花瓣是透明的,只有輪廓。
那麼這個輪廓,可以這樣畫:
- 由於每個點都是動態的,我們就不能把輪廓一次性畫好。
- 通過觀察和思考,我們就可以發現,只需要捕捉每一個旋轉點的位置變化的規律即可。
- 如果把圖形分解成360個發散的線,每個線按照時間的規律產生變化,就可以顯示出動態花的效果。
這裡涉及到動畫的原理。
就如同射線一樣,找到點的規律。
讓視覺效果看起來像旋轉的花。上圖是一個點及後續點變化。
下面看如果10個點的顯示。
90個點的顯示。
同理,360個點都畫出來,然後動態循環,就形成了可以旋轉的花。
所以,核心的問題在於,一個點是按照上面規律畫出來的。
這裡就用到了之前設定的變數。及三角函數的概念。
從原始點出發,設定點移動的橫軸長度為x,縱軸長度為y。
我們使用siny(1-sinx)來確定曲線的移動步數。
形成siny(1-sinx)sizex,cosy(1-sinx)sizey的波形
然後繪製花瓣頁陰影。
及根據旋轉方向確定下一個點。
具體代碼如下:
這樣我們就可以輕鬆繪製一個科幻效果的花瓣了。
其中的幾個變數,通過修改,可以形成不同的動畫效果。
由於篇幅原因,畫花我們分上下兩節。
今天的課就到此為止。
下面一節課,我們繼續學習畫花。是玫瑰和雪花啦,都很浪漫,一定是風花雪月的感覺吧。
如果想獲得詳細代碼,可以註冊卡搭,到下面網址就可以看程序效果並閱讀代碼了。
http://kada.163.com/project/275197-129466.htm
如果對我們的課程有興趣,可以報名參加我們為期2個月的少兒編程課程進行更加系統的學習哦。
推薦閱讀:
※編程中所講的「思維深度」的本質是什麼?
※有什麼你覺的很好的 idea,卻一直沒時間來實現?
※有哪些有趣又優美的編程語言?
※[數據結構]表達式樹——手動eval()