Intoweb
我們上期已經知道了勾股數(shù)——符合勾股定理(a2+b2=c2)的一組數(shù)字,將它圖形化表達如圖1所示。
以勾股定理圖為基礎,以兩個較小的正方形(a和b)為基礎,繼續(xù)按勾股定理生長,又能畫出下一代的勾股定理圖,如此循環(huán)畫下去,最終得到一棵完全由勾股定理圖組成的樹狀圖形,稱之為“勾股樹”,再恰當不過(如圖2)。
由于圖中的一個部分和它的整體或者其他部分都十分相似,因而被稱為分形圖,分形圖內任何一個相對獨立的部分,在一定程度上都是整體的再現(xiàn)和縮影。這就是分形圖的自相似的特性。所以我們以前繪制過的謝爾賓斯基三角形也是一種分形圖(如圖3)。
我們用Scratch來畫勾股樹。
1. 定義自制積木“勾股樹(邊長)”(圖4)。
2. 以正方形的左下角為起點開始畫出一個大正方形c,并多畫一條邊,循環(huán)次數(shù)從普通方形的4次變?yōu)?次,在方形的左上角終止,作為下一個正方形b的起點。
3. 左轉120°,并用勾股樹積木畫出正方形b,此處使用了遞歸——循環(huán)中引用了自身。根據(jù)勾股定理計算,b的邊長以大正方形邊長c作為三角形的斜邊(b=c×cos30°)(如圖5)。
4. 移動到正方形b的右下角,右轉90°。以此為起點用勾股樹積木繪制正方形a,根據(jù)勾股定理計算,a的邊長以大正方形邊長c作為三角形的斜邊,(a=c×cos60°)(如圖6)。
5. 移動到正方形b的左上角,以正方形b為大正方形開始繪制出下一代3個正方形。
6. 由于用到了遞歸,為了程序的正常運行,必須給循環(huán)一個出口。以最小正方形的邊長作為判斷條件,當邊長小于5時跳出循環(huán)。用“如果…那么”積木和“停止這個腳本”組合完成條件判斷和終止循環(huán)。
7. 自定義積木程序(如圖7)。
8. 引用自定義積木,設定開始位置和第一個正方形邊長(如圖8)。
9. 程序運行結果如圖9,點擊“編輯—打開加速模式”,可以快速畫完圖形(如圖9)。
10. 圖9繪制的圖形是30度60度角的直角三角形。想要繪制等腰直角三角形的勾股樹只要改變小正方形邊長為(b=c×cos45°),旋轉角度變?yōu)?35°和45°(如圖10)。你也可以通過改變勾股定理圖中直角三角形兩個銳角大小構建不同形狀的勾股樹(詳細代碼可掃碼下載)。
Scratch的畫筆沒有填色功能,所以看起來比較簡陋,使用Python的turtle小海龜庫繪制圖形可以填色,繪制出來的勾股樹更好看(如圖2)。但是繪制速度遠不及使用加速模式的Scratch。
1. 本例用到了turtle的繪圖和填色功能;math的cos函數(shù)和 radians函數(shù)(角度轉弧度);用random產生隨機數(shù),用于方塊的隨機顏色。
2. 具體算法原理與Scratch方法一致。
3. 定義繪制勾股樹的函數(shù)“draw(a):”。
4. 定義出口條件“if a > 5:”。
5. 設置隨機的rgb顏色。
6. 繪圖使用填充狀態(tài)“begin_fill()”。
7. 和剛才繪制正方形一樣需要循環(huán)5次“for i in range(5):”。
8. 由于Python的math庫的cos(X)函數(shù)是以弧度制求X的余弦。我們在Scratch中的(a×cos30°)需要用radians將30度轉化為30弧度代入計算才能獲得正確結果。
所以繪制方形語句為“draw(a * cos(radians(30)))”。
9. 小烏龜?shù)木唧w繪制路徑和Scratch相同。
10. mode(‘logo),表示初始方向是向上(北)。將logo改為standard則是向右(東)。
11. speed(0),設定移動速度,0-10。0已經是最快了,但是還是挺慢的。
12. done(),寫在程序最后一行,避免畫完圖形就自動關閉(如圖11)。