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,作為畫筆的橫縱軸的需要移動位置。

於是乎,我們就可以動態定義出一個有科幻效果的花。

畫花的思路,其實和上一個圖差不多。但是我們需要動起來。

所以如果花瓣變成實心的,程序處理周期就長了。

所以我們的科幻效果,就是花瓣是透明的,只有輪廓。

那麼這個輪廓,可以這樣畫:

  1. 由於每個點都是動態的,我們就不能把輪廓一次性畫好。
  2. 通過觀察和思考,我們就可以發現,只需要捕捉每一個旋轉點的位置變化的規律即可。
  3. 如果把圖形分解成360個發散的線,每個線按照時間的規律產生變化,就可以顯示出動態花的效果。

這裡涉及到動畫的原理。

就如同射線一樣,找到點的規律。

讓視覺效果看起來像旋轉的花。上圖是一個點及後續點變化。

下面看如果10個點的顯示。

90個點的顯示。

同理,360個點都畫出來,然後動態循環,就形成了可以旋轉的花。

所以,核心的問題在於,一個點是按照上面規律畫出來的。

這裡就用到了之前設定的變數。及三角函數的概念。

從原始點出發,設定點移動的橫軸長度為x,縱軸長度為y。

我們使用siny(1-sinx)來確定曲線的移動步數。

形成siny(1-sinx)sizex,cosy(1-sinx)sizey的波形

然後繪製花瓣頁陰影。

及根據旋轉方向確定下一個點。

具體代碼如下:

這樣我們就可以輕鬆繪製一個科幻效果的花瓣了。

其中的幾個變數,通過修改,可以形成不同的動畫效果。

由於篇幅原因,畫花我們分上下兩節。

今天的課就到此為止。

下面一節課,我們繼續學習畫花。是玫瑰和雪花啦,都很浪漫,一定是風花雪月的感覺吧。

如果想獲得詳細代碼,可以註冊卡搭,到下面網址就可以看程序效果並閱讀代碼了。

kada.163.com/project/27

如果對我們的課程有興趣,可以報名參加我們為期2個月的少兒編程課程進行更加系統的學習哦。


推薦閱讀:

編程中所講的「思維深度」的本質是什麼?
有什麼你覺的很好的 idea,卻一直沒時間來實現?
有哪些有趣又優美的編程語言?
[數據結構]表達式樹——手動eval()

TAG:編程 | 少兒編程 |