在 GeoGeBra 內製作碎形並不是太困難的事情,但是 GGB 很容易當機,因此要注意隨時存檔喔:D
Outline
- 二元樹
- 謝爾賓斯基三角形
二元樹 Binary Tree
定義
二元樹是每個節點最多只有兩個分支的樹狀結構
分支具有左右次序,不能隨意顛倒
而本次製作的是完全二元樹
Outline
- 做出初始線段
- 線段集
- 工具
- 迭代
製作
首先做出任意兩點 A, B 以及 5 個滑桿:
- n - 迭代次數
- r1, r2 - 左右線段比例
- a, b - 左右角度
請特別注意那個"度"
做完應該長這樣
接下來我們開始下幾個指令:
1 | u = Vector(A, B) |
- Vector 產生起點至終點的向量
- Translate 由起點位置往向量方向延伸做新點
- Dilate 將輸入的向量伸縮
- Rotate 將物件旋轉最後我們把這些東西作成線段並存成串列
1
2
3
4
5// 各參數意義
Vector( <Start Point>, <End Point> )
Translate( <Vector>, <Start Point> )
Dilate( <Object>, <Dilation Factor>, <Dilation Center Point> )
Rotate( <Object>, <Angle>, <Point> )然後把 B1 到 B5 隱藏起來1
2list1 = {Segment(B, B3), Segment(B, B5)}
// Segment[ <Point>, <Point> ]
接下來要自訂工具
輸出:
輸入: 順序請按照圖片上的標示
來測試一下:D
新增隨意點 C、 D
然後輸入指令:
1 | branch(C, D, a, b, r1, r2) |
接下來我們要一步步做出最終的式子:D
1 | IterationList(Flatten(Sequence(branch(Vertex(Element(list1,i),1),Vertex(Element(list1,i),2),a,b,r1,r2),i, 1,Length(list1))),list1,{{Segment(A,B)}},n) |
怕豹
所以先準備這條:D
1 | branch(Vertex(Element(list1,i),1),Vertex(Element(list1,i),2),a,b,r1,r2) |
- Vertex - 將線段中的點取出
- Element - 將串列中的元素取出所以剛剛那條是
1
2Vertex( <Segment>, <Index> )
Element( <List>, <Position of Element n> )
“將 list1 中的第 i 個線段取出,並得到那兩個點”,再拿那兩個點做新線。可是 GGB 不認識 “i” 是誰ㄚ
所以要來實現一個”迴圈”的功能,加上”Sequence”!
1 | Sequence( <Expression>, <Variable k>, <Start Value a>, <End Value b> ) |
把這個套上剛剛的那式就變成:
1 | Sequence(branch(Vertex(Element(list1,i),1),Vertex(Element(list1,i),2),a,b,r1,r2),i,1,Length(list1)) |
最後把產生的串列攤平:
1 | Flatten(Sequence(branch(Vertex(Element(list1,i),1),Vertex(Element(list1,i),2),a,b,r1,r2),i,1,Length(list1))) |
今天的主角: IterationList
1 | IterationList( <Expression>, <Variable Name>, ..., <Start Values>, <Number of Iterations> ) |
我們以 list1 作為迭代物件,點 A、B 作為初始值
1 | IterationList( <Expression>, list1, {{Segment(A,B)}},n) |
再把上面那一長串指令帶入 expression:
1 | IterationList(Flatten(Sequence(branch(Vertex(Element(list1,i),1),Vertex(Element(list1,i),2),a,b,r1,r2),i,1,Length(list1))), list1, {{Segment(A,B)}},n) |
就大功告成啦:D
:D
謝爾賓斯基三角形 Sierpinsky Triangle
Outline
- 三角形
- 往內縮放
- 迭代
製作
首先做出任意兩點 A、B
並使用 polygon()
函數做出正三角形
1 | poly1 = Polygon(A, B, 3) // 後面的 3 代表三邊的正多邊形 |
接下來使用剛剛有提到的 Dilate() 來縮放三角形
並使用 Zip() 各對三頂點縮放
- Zip(): 將 expression 內的變數以 list 內的替換
1
2
3
4Zip( <Expression>, <Var1>, <List1>, <Var2>, <List2>, ...)
Dilate(poly1,0.5,O) // 以 0.5 倍縮放 poly1
Zip(Dilate(poly1,0.5,O),O,{Vertex(poly1)}) // 將 {vertex(poly1)} 中的點代進 O
// 指令請輸入第三行的
接下來就可以來迭代啦
下一種迭代技巧: Iteration()
- Iteration: 將上一層得出的結果輸入到下一層中
1
Iteration( <Expression>, <Variable Name>, ..., <Start Values>, <Number of Iterations> )
1 | Iteration(Join(Zip(Zip(Dilate(poly1,0.5,O),O,{Vertex(poly1)}),poly1,p1)),p1,{{Polygon(A,B,3)}},n) |
以上式子做的事:
- 以
{{Polygon(A, B, 3)}}
作為初值 - 用
Zip()
將大括號內的串列取出 - 放入 expression
本文章同步發布於 HackMD