基因與生成元算法


本章繪圖要點:

  • 生成元算法:重復性的繪圖步驟可抽象提煉成數據,保存在列表或元組里,然后,依據抽象規則,讀取數據,調用繪圖函數,生成所需要的圖形,從而降低程序的復雜性,減少程序的代碼量。
  • 繪圖效率:當圖形的數據計算量比較大時,可先統一計算,然后再繪圖,從而提高圖形的生成效率。

 一生二,二生三

“道生一,一生二,二生三,三生萬物。

                                                        --《道德經》

為什么相對少量的遺傳物質可以發育成復雜的結構,如肺、大腦、心臟?

為什么只占人體體積5%的血管能遍布人體的每一部分?

生命究竟是什么?生命最初又是如何形成的?

基因存在於染色體上,負責對生命體的形態、結構、功能進行全方位的編碼,它所包含的信息必定有限,然而如此有限的信息又是如何准確地描述后代生命的性狀?

經典理論無法解釋自然界這些讓人困惑的問題,直到分形理論的出現,才讓這些問題有了一個可能的答案。簡單而少量的規則是可以生成復雜結構的,自然界中的許多事物可以通過簡單步驟的無數次重復(也就是分形迭代)演化而成。

由一個簡單的生成因子(分形理論中稱之為“生成元”),不斷迭代,自我進化,越來越復雜,以至於逐步出現山川、草木、動物、人類及人類的思維。宇宙間的一切難道都是這樣動態生成的嗎?聽起來不可思議,但或許這就是事實!

生成元

我們可以在計算機上做個小實驗,用『原形+生成元+迭代』的方式,來生成一些復雜的圖形。上一章的科赫曲線的原形是一條直線,生成元是:

如果保持原形為一條直線,改變生成元,那么多次迭代后,會生成一個怎么樣的圖形呢?

生成元1:

 

第一次迭代同生成元;

第二次迭代:

 

第三次迭代:

 

第六次迭代:

 

 

生成元2:

 

第一次迭代同生成元;

第二次迭代:

 

第三次迭代:

 

第四次迭代:

 

 你可以嘗試設計不同的生成元,多次迭代后,看看會生成怎樣復雜的圖形。為了更清晰地顯示圖形的細微結構,示例程序畫筆的顏色選擇的是默認的黑色,你也可以選擇自己喜歡的單種或多種顏色,來生成更絢爛的圖形。

 

2.3 算法

我們可以用一個列表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))

數據可視化Tips

配色方案

在可視化作品的設計中,配色是至關重要的一環,配色方案的好壞會直接影響到可視化結果的表現力。和諧、美觀的配色方案,可以吸引用戶去探索可視化所包含的信息;而不恰當的配色方案,則會造成用戶的迷惑以及對可視化的抵觸。在配色方案的設計時,通常要考慮到許多方面,比如:需要可視化的數據是什么樣的類型?這些數據擁有哪些定性或定量的屬性?將這些數據可視化的目的是什么?所面向的又是怎樣的用戶群體?等等。
顏色的運用和搭配,並不是件容易的事,需要大量的學習和實踐。對於初學者來說,向經典學習無疑是最適宜的一條道路,以下是推薦的一些經典配色作品:
  • 中國古典配色:中國的傳統顏色來自於大自然,它以天然植物、動物、礦物作為原料,色彩范圍廣,並融合了中國傳統的自然哲學思想,溫潤柔和、不張揚,蘊涵着其獨有的特色和魅力。瓷器、國畫、壁畫、服飾、建築等等,都是學習、臨摹古典配色的優秀素材。
  • 莫蘭迪配色:莫蘭迪色據說是世界上最舒服的高級“配色”,它來自於意大利藝術家喬治·莫蘭迪的一系列靜物作品,並以其命名。莫蘭迪配色指的是一種色彩關系,它在所有的顏色中都加入了適度的白色和灰色來進行調和,將原本鮮艷的色彩轉化成了優雅的灰色調,就仿佛蒙上了一層灰一樣,卻從而產生了一種柔和的、不張揚的平衡美感。
  • 經典影視劇:經典影視劇的每一幀都是一副畫作,配色考究,制作精良。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM