Scratch編程之圖形特效(9)星夜
曾經有一幅畫,非常有名,他是是荷蘭後印象派畫家文森特·梵高於1889年在法國聖雷米的一家精神病院里創作的一幅著名油畫,是梵高的代表作之一。
他的名字叫《星夜》,也就是星夜月。
這幅畫非常抽象,在小說三體里,倒是描述了太陽系被二向箔毀滅時的場景,就是星夜。
如今的都市,很難看見如此的星空了。
然而,當我們在星夜裡仰望天空的時候,我們會想到什麼呢?
是宇宙的浩瀚,還是人類的渺小。
有人告訴MrCode,說這個世界很大,很大,沒有邊際。
然而,MrCode想告訴大家的是,這個世界無論有多大,他都只在於你的眼裡。
今天,我們畫一個MrCode心中的星夜。
MrCode沒有梵高大師的想像力和藝術創作水平。
但是MrCode有Scratch,可以編程啊。
所以一個星夜,還不是幾行代碼的事情。
當然,浩瀚的星空,那是幾行代碼可以搞定的。
只是,我們可以想像星空是怎樣的。
例如,星星看起來發光,而且星星會旋轉。
他們旋轉的方向都是有軌跡的。
為了顯示出星空的浩瀚,所以,我們僅僅畫出循環的圈是不夠的。
因為星系之間,也有非常多的交互。
所以,會形成一個非封閉的循環。
於是為了顯示出星空的動態。
要根據時間,從星系的中心開始分散,星星會隨著時間增加,越來越多。
我們可以先放置一張有星空背景的圖片。
那麼,可以以該中心點為起始點。
這裡,我們採用一個函數公式來計算點顯示的坐標。
迭代函數系統(IFS)。
IFS是分形的重要分支。它是分形圖像處理中最富生命力而且最具有廣闊應用前景的領域之一。這一工作最早可以追溯到Hutchinson於1981年對自相似集的研究。美國科學家M.F.Barnsley於1985年發展了這一分形構型系統,並命名為迭代函數系統(Iterated Function System,IFS),後來又由Stephen Demko等人將其公式化,並引入到圖像合成領域中。IFS將待生成的圖像看做是由許多與整體相似的(自相似)或經過一定變換與整體相似的(自仿射)小塊拼貼而成。 演算法: 1.設定一個起始點(x0,y0)及總的迭代步數。 2.以概率P選取仿射變換W,形式為 X1=a*x0 + b*y0 + e Y1=c*x0 + d*y0 + f 或 X1=(a * x0*cosf(c/180)) - (b * y0*sinf(d/180)) + e Y1=(a * x0*sinf(c/180)) + (b * y0*cosf(d/180)) + f 3.以W作用點(x0,y0),得到新坐標(x1,y1)。 4.令x0=x1,y0=y1。 5.在屏幕上打出(x0,y0)。 6.重返第2步,進行下一次迭代,直到迭代次數大於總步數為止。
我們計算出旋轉的坐標系,不需要特別的精細,可以是:
f1(0.8x - 0.4y +2; 0.2x + 0.9y+2) p1=1/3 f2(-0.3x + 0.7y - 7; -0.2x + 0.·y +·.5) p2=1/3 f3(0.2x -0.1y+7; 0.1x + 0.2y -1.5) p3=1/3
~~~~~~~~~~~~~~~~~~~~~~~~
形成代碼如下:
其中,functions是我們定義的鏈表。
function是變數,以獲取鏈表的值。
最終顯示效果為:
由於代碼執行迭代,所以腳本偏慢,可以採用加速模式顯示。
效果如下:
再配上克萊德曼的《星空》
是不是很有點趕腳。(點擊閱讀原文進入)
喜歡這份代碼,快去卡搭收下吧:
定時有流星許願哦!
想學習Scratch編程,請添加一下微信進一步諮詢。
掃描下面二維碼,備註「編程」
https://u.wechat.com/MGV6pdayLwsdXyqV7B1KCmk (二維碼自動識別)
推薦閱讀:
TAG:少兒編程 |