Python學習Turtle庫畫對稱勾股樹體會分形驚艷
分形,具有以非整數(shù)維形式充填空間的形態(tài)特征。通常被定義為“一個粗糙或零碎的幾何形狀,可以分成數(shù)個部分,且每一部分都(至少近似地)是整體縮小后的形狀”,即具有自相似的性質(zhì)。分形(Fractal)一詞,是芒德勃羅創(chuàng)造出來的,其原意具有不規(guī)則、支離破碎等意義。1973年,芒德勃羅(B.B.Mandelbrot)在法蘭西學院講課時,首次提出了分維和分形的設想。
分形是一個數(shù)學術語,也是一套以分形特征為研究主題的數(shù)學理論。分形理論既是非線性科學的前沿和重要分支,又是一門新興的橫斷學科,是研究一類現(xiàn)象特征的新的數(shù)學分科,相對于其幾何形態(tài),它與微分方程與動力系統(tǒng)理論的聯(lián)系更為顯著。分形的自相似特征可以是統(tǒng)計自相似,構(gòu)成分形也不限于幾何形式,時間過程也可以,故而與鞅論關系密切。
分形幾何是一門以不規(guī)則幾何形態(tài)為研究對象的幾何學。由于不規(guī)則現(xiàn)象在自然界普遍存在,因此分形幾何學又被稱為描述大自然的幾何學。分形幾何學建立以后,很快就引起了各個學科領域的關注。不僅在理論上,而且在實用上分形幾何都具有重要價值。
——摘自百度百科


分形樹是分形幾何中的一小種類型,一棵分形樹相當于一棵“滿二叉樹”。通常都用遞歸來實現(xiàn),遞歸條件通常分兩派,一派是用長度遞減,直到長度不滿足某個條件時退出;另一派則是按層數(shù)來遞歸,相當于“滿二叉樹”的層序遍歷。前一派的長度遞歸相當于“滿二叉樹”的先序遍歷,從根出發(fā)先左子樹后右子樹,每一棵子樹都按這種“先根后左右”的順序遍歷。
舉個例子:

源代碼:
import turtle
def bintree(size):
angle = 60 # 分叉的角度
if size > 5: # 長度退出條件
turtle.forward(size)
turtle.left(angle)
bintree(size / 1.6)
turtle.right(angle*2)
bintree(size / 1.6)
turtle.left(angle)
turtle.backward(size)
def main():
turtle.speed(0)
turtle.hideturtle()
turtle.penup()
turtle.left(90)
turtle.backward(100)
turtle.showturtle()
turtle.pendown()
turtle.pensize(2)
turtle.color('green')
bintree(150)
turtle.done()
if __name__ == '__main__':
main()
以上代碼中長度以等比數(shù)列遞減,公比1/1.6;當然也可以改成等差數(shù)列形式。此方式缺點樹的層數(shù)不能直接控制,需要用初始長度、遞減公式和退出條件來計算得出。
勾股樹,其實就是分形樹的一種,只是不像上例一樣簡單地畫2個分叉,而是畫直角三角形加上各邊上的正方形,就像平面幾何中勾股定理證明時畫的示意圖。
以下是我用Turtle庫畫的一棵12層的對稱勾股樹,使用“層序遍歷”方式:

根據(jù)二叉樹的性質(zhì)可知:12層的樹會有 2^12 - 1 個正方形以及同樣數(shù)量的三角形。時間復雜度為指數(shù)級,在關掉畫筆蹤跡開關的情況下畫完此時耗時43秒。
簡單點,就用一個6層的來示意一下其“層序”的過程:

源代碼:
from turtle import *
def Square(self,length):
for _ in range(5):
self.forward(length)
self.right(90)
def Triangle(self,length):
self.left(45)
self.forward(length/2**0.5)
self.right(90)
self.forward(length/2**0.5)
self.right(135)
self.forward(length)
def Move2Right(self,length):
self.back(length)
self.right(45)
self.forward(length/2**0.5)
self.right(90)
def Recursive(n, tracer, length):
if n<1: return
tracers = []
for left in tracer:
if n<3: left.pencolor('green')
else: left.pencolor('brown')
Square(left, length)
Triangle(left, length)
right = left.clone()
left.right(45)
Move2Right(right, length)
tracers.append(left)
tracers.append(right)
Recursive(n-1, tracers, length/2**0.5)
def Setup(self, length, speed):
self.hideturtle()
self.speed(speed)
self.penup()
self.goto(-length*0.5, -length*1.8)
self.seth(90)
self.pensize(2)
self.pendown()
def main(level, length, speed=-1):
setup(800,600)
title('Fractal Tree')
if speed==-1: tracer(0)
else: tracer(1)
t = Turtle()
Setup(t, length, speed)
from time import sleep
sleep(2)
Recursive(level, list([t]), length)
done()
bye()
if __name__ == '__main__':
main(6,150,10)
主函數(shù): main(level, length, speed=-1)
參數(shù):
level: 樹的層數(shù)
length: 最底層正方形的邊長
speed: 1~10,畫筆速度遞增;=0時速度最快;=-1時關閉畫筆蹤跡。
本篇完,其他分形圖待繼......
更多關于Turtle庫實現(xiàn)對稱勾股樹的資料請關注本站其它相關文章!
版權聲明:本站文章來源標注為YINGSOO的內(nèi)容版權均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務器上建立鏡像,否則將依法追究法律責任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學習參考,不代表本站立場,如有內(nèi)容涉嫌侵權,請聯(lián)系alex-e#qq.com處理。
關注官方微信