本章繪圖要點:算法
「道生一,一輩子二,二生三,三生萬物。app
--《道德經》ide
爲何相對少許的遺傳物質能夠發育成複雜的結構,如肺、大腦、心臟?函數
爲何只占人體體積5%的血管能遍及人體的每一部分?學習
生命到底是什麼?生命最初又是如何造成的?編碼
基因存在於染色體上,負責對生命體的形態、結構、功能進行全方位的編碼,它所包含的信息一定有限,然而如此有限的信息又是如何準確地描述後代生命的性狀?spa
經典理論沒法解釋天然界這些讓人困惑的問題,直到分形理論的出現,才讓這些問題有了一個可能的答案。簡單而少許的規則是能夠生成複雜結構的,天然界中的許多事物能夠經過簡單步驟的無數次重複(也就是分形迭代)演化而成。設計
由一個簡單的生成因子(分形理論中稱之爲「生成元」),不斷迭代,自我進化,愈來愈複雜,以致於逐步出現山川、草木、動物、人類及人類的思惟。宇宙間的一切難道都是這樣動態生成的嗎?聽起來難以想象,但或許這就是事實!3d
咱們能夠在計算機上作個小實驗,用『原形+生成元+迭代』的方式,來生成一些複雜的圖形。上一章的科赫曲線的原形是一條直線,生成元是:rest
若是保持原形爲一條直線,改變生成元,那麼屢次迭代後,會生成一個怎麼樣的圖形呢?
生成元1:
第一次迭代同生成元;
第二次迭代:
第三次迭代:
第六次迭代:
生成元2:
第一次迭代同生成元;
第二次迭代:
第三次迭代:
第四次迭代:
你能夠嘗試設計不一樣的生成元,屢次迭代後,看看會生成怎樣複雜的圖形。爲了更清晰地顯示圖形的細微結構,示例程序畫筆的顏色選擇的是默認的黑色,你也能夠選擇本身喜歡的單種或多種顏色,來生成更絢爛的圖形。
咱們能夠用一個列表genu來指定生成元,例如科赫曲線的生成元可用列表gene = [0,60,-120,60,END]來表示:
列表的每一個值表示了旋轉角的大小,正數是逆時針旋轉,負數是順時針旋轉。A點不旋轉,爲0;C點逆時針旋轉60度,爲60;D點順時針旋轉120,爲-120;E點逆時針旋轉60,爲60;END表示終止指定生成元(實際上它能夠是任意值)。從一次旋轉到下次旋轉之間的距離是必定的,也就是說,AC、CD、DE、EB的長度是相同的,都爲AB的1/3。
除了生成元之外,咱們還須要一個縮小率ratio:下一次迭代的線段和原始線段的比率,也就是AC/AB,科赫曲線的這個比率咱們知道就是1/3,約爲0.3333。
生成元1 的生成元可用列表[-15,90,-150,90,END]來表示:
列表的每一個值表示了旋轉角的大小,正數是逆時針旋轉,負數是順時針旋轉。A點順時針旋轉15,爲-15;C點逆時針旋轉90度,爲90;D點順時針旋轉150,爲-150;E點逆時針旋轉90,爲90;END表示終止指定生成元。 AC、CD、DE、EB的長度是相同的。
生成元1 的縮小率ratio(下一次迭代的線段和原始線段的比率),也就是AC/AB,這個比率咱們經過計算可知:
ratio == 0.40824829046386296 ≈ 0.4082
生成元2 的生成元可用列表[0,90,-90,-90,90,-90,90,90,-90,END]來表示:
列表的每一個值表示了旋轉角的大小,正數是逆時針旋轉,負數是順時針旋轉。生成元2 的縮小率爲:
ratio = 1/5 = 0.2
下表爲幾種曲線的生成元和縮小率:
|
科赫曲線 |
生成元1 |
生成元2 |
生成元gene |
[0,60,-120,60,END] |
[-15,90,-150,90,END] |
[0,90,-90,-90,90,-90,90,90,-90,END] |
縮小率ratio |
1/3 ≈ 0.3333 |
0.4082 |
1/5 = 0.2 |
# 導入模塊 import turtle # 恢復海龜狀態到p點 def restore(p): turtle.penup() turtle.setpos(p[0],p[1]) turtle.pendown() turtle.seth(p[2]) # 獲取海龜當前點狀態 def get_point(): x,y = turtle.pos() d = turtle.heading() return (x,y,d) # 生成器函數,A爲起始點,B爲結束點,L爲線段AB的長度,genu爲生成元,ratio爲縮小率,n爲迭代次數 def Generator(A,B,L,genu,ratio,n): # 獲取圖形各個點的位置和方向,不顯示圖形 restore(A) turtle.pencolor(b_color) # 畫筆顏色設置和背景色相同,不顯示圖形 points = [] for angle in gene: if angle == 'END': break else: angle = int(angle) if angle < 0: turtle.right(abs(angle)) else: turtle.left(angle) p = get_point() points.append(p) turtle.forward(L*ratio) points.append(B) turtle.pencolor(p_color) # 恢復畫筆顏色 if n == 1: # 繪製圖形 restore(A) for p in points: turtle.setpos(p[0],p[1]) else: # 遞歸調用生成器,使用生成元替換中間線段 i = 0 while i <len(points)-1: Generator(points[i],points[i+1],L*ratio,gene,ratio,n-1) i = i+1 # 開始主程序 if __name__ == '__main__': # 隱藏畫筆形狀 turtle.hideturtle() # 指定畫筆的速度,參數speed爲0到10之間的一個整數,1最慢,10最快 turtle.speed(9) # 指定畫筆大小 turtle.pensize(1) # 設置顏色模式爲RGB turtle.colormode(255) # 背景顏色爲青色,畫筆顏色爲白色 b_color = (136,168,155) p_color = 'white' # 設置背景顏色 turtle.bgcolor(b_color) # 原形爲一條直線 A = (-450,0,0) B = (450,0,0) L = 900 # 獲取用戶輸入的生成元、縮小率、迭代次數 print('生成元:') gene = input().split(',') print('縮小率:') ratio = float(input()) print('迭代次數:') n = int(input()) # 生成圖形 restore(A) Generator(A,B,L,gene,ratio,n)
生成元1彩圖1(青色RGB(136,168,155) /白色)
生成元1彩圖2(背景色RGB(224,225,227),畫筆色RGB(176,186,175))
生成元1彩圖3(背景色RGB(181,138,93),畫筆色RGB(214,226,206))
在信息可視化設計中,配色是設計繞不開的環節,配色方案直接關係到可視化結果的信息表達和易讀性。和諧的配色方案,能夠增長可視化結果的美觀性,讓用戶更有興趣去探索可視化所包含的信息,而不恰當的配色方案,則會形成用戶對可視化的抵觸。在設計配色方案時,一般須要考慮到不少因素,好比:須要可視化的數據是什麼樣的類型?這些數據擁有哪些定性或定量的屬性?將這些數據可視化的目的是什麼?所面向的是怎樣的用戶羣體?等等。
顏色看起來很是簡單,可是卻很難處理好。靈活地運用和搭配顏色,須要大量的學習和實踐,對於初學者來講,向經典學習無疑是最適宜的一條道路,如下是推薦的一些經典配色做品: