Python學(xué)習(xí)Turtle庫(kù)畫對(duì)稱勾股樹體會(huì)分形驚艷
分形,具有以非整數(shù)維形式充填空間的形態(tài)特征。通常被定義為“一個(gè)粗糙或零碎的幾何形狀,可以分成數(shù)個(gè)部分,且每一部分都(至少近似地)是整體縮小后的形狀”,即具有自相似的性質(zhì)。分形(Fractal)一詞,是芒德勃羅創(chuàng)造出來(lái)的,其原意具有不規(guī)則、支離破碎等意義。1973年,芒德勃羅(B.B.Mandelbrot)在法蘭西學(xué)院講課時(shí),首次提出了分維和分形的設(shè)想。
分形是一個(gè)數(shù)學(xué)術(shù)語(yǔ),也是一套以分形特征為研究主題的數(shù)學(xué)理論。分形理論既是非線性科學(xué)的前沿和重要分支,又是一門新興的橫斷學(xué)科,是研究一類現(xiàn)象特征的新的數(shù)學(xué)分科,相對(duì)于其幾何形態(tài),它與微分方程與動(dòng)力系統(tǒng)理論的聯(lián)系更為顯著。分形的自相似特征可以是統(tǒng)計(jì)自相似,構(gòu)成分形也不限于幾何形式,時(shí)間過(guò)程也可以,故而與鞅論關(guān)系密切。
分形幾何是一門以不規(guī)則幾何形態(tài)為研究對(duì)象的幾何學(xué)。由于不規(guī)則現(xiàn)象在自然界普遍存在,因此分形幾何學(xué)又被稱為描述大自然的幾何學(xué)。分形幾何學(xué)建立以后,很快就引起了各個(gè)學(xué)科領(lǐng)域的關(guān)注。不僅在理論上,而且在實(shí)用上分形幾何都具有重要價(jià)值。
——摘自百度百科
分形樹是分形幾何中的一小種類型,一棵分形樹相當(dāng)于一棵“滿二叉樹”。通常都用遞歸來(lái)實(shí)現(xiàn),遞歸條件通常分兩派,一派是用長(zhǎng)度遞減,直到長(zhǎng)度不滿足某個(gè)條件時(shí)退出;另一派則是按層數(shù)來(lái)遞歸,相當(dāng)于“滿二叉樹”的層序遍歷。前一派的長(zhǎng)度遞歸相當(dāng)于“滿二叉樹”的先序遍歷,從根出發(fā)先左子樹后右子樹,每一棵子樹都按這種“先根后左右”的順序遍歷。
舉個(gè)例子:
源代碼:
import turtle def bintree(size): angle = 60 # 分叉的角度 if size > 5: # 長(zhǎng)度退出條件 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()
以上代碼中長(zhǎng)度以等比數(shù)列遞減,公比1/1.6;當(dāng)然也可以改成等差數(shù)列形式。此方式缺點(diǎn)樹的層數(shù)不能直接控制,需要用初始長(zhǎng)度、遞減公式和退出條件來(lái)計(jì)算得出。
勾股樹,其實(shí)就是分形樹的一種,只是不像上例一樣簡(jiǎn)單地畫2個(gè)分叉,而是畫直角三角形加上各邊上的正方形,就像平面幾何中勾股定理證明時(shí)畫的示意圖。
以下是我用Turtle庫(kù)畫的一棵12層的對(duì)稱勾股樹,使用“層序遍歷”方式:
根據(jù)二叉樹的性質(zhì)可知:12層的樹會(huì)有 2^12 - 1 個(gè)正方形以及同樣數(shù)量的三角形。時(shí)間復(fù)雜度為指數(shù)級(jí),在關(guān)掉畫筆蹤跡開關(guān)的情況下畫完此時(shí)耗時(shí)43秒。
簡(jiǎn)單點(diǎn),就用一個(gè)6層的來(lái)示意一下其“層序”的過(guò)程:
源代碼:
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: 最底層正方形的邊長(zhǎng)
speed: 1~10,畫筆速度遞增;=0時(shí)速度最快;=-1時(shí)關(guān)閉畫筆蹤跡。
本篇完,其他分形圖待繼......
更多關(guān)于Turtle庫(kù)實(shí)現(xiàn)對(duì)稱勾股樹的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python Tornado框架輕松寫一個(gè)Web應(yīng)用的全過(guò)程
Tornado全稱Tornado Web Server,是一個(gè)用Python語(yǔ)言寫成的Web服務(wù)器兼Web應(yīng)用框架,Tornado走的是少而精的方向,注重的是性能優(yōu)越,它最出名的是異步非阻塞的服務(wù)器方式,這篇文章主要給大家介紹了關(guān)于Python Tornado框架輕松寫一個(gè)Web應(yīng)用的相關(guān)資料,需要的朋友可以參考下2021-08-08anaconda如何創(chuàng)建和刪除環(huán)境
這篇文章主要介紹了anaconda如何創(chuàng)建和刪除環(huán)境,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04django2筆記之路由path語(yǔ)法的實(shí)現(xiàn)
這篇文章主要介紹了django2筆記之路由path語(yǔ)法的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07python實(shí)現(xiàn)自動(dòng)清理重復(fù)文件
這篇文章主要介紹了python如何實(shí)現(xiàn)自動(dòng)清理重復(fù)文件,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下2020-08-08Python實(shí)現(xiàn)日志實(shí)時(shí)監(jiān)測(cè)的示例詳解
觀察者模式:是一種行為型設(shè)計(jì)模式。主要關(guān)注的是對(duì)象的責(zé)任,允許你定義一種訂閱機(jī)制,可在對(duì)象事件發(fā)生時(shí)通知多個(gè)"觀察"該對(duì)象的其他對(duì)象。本文將利用觀察者模式實(shí)現(xiàn)日志實(shí)時(shí)監(jiān)測(cè),需要的可以參考一下2022-04-04