前言 本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。 作者:彥頁走刀口 今天我們來看看用ghpython怎麼實現koch曲線的分形效果,前兩天分享的雪花分形是利用grasshopper的迴圈插件anemone實現的,然後有個小伙 ...
前言
本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。
作者:彥頁走刀口
今天我們來看看用ghpython怎麼實現koch曲線的分形效果,前兩天分享的雪花分形是利用grasshopper的迴圈插件anemone實現的,然後有個小伙伴說了句十分激勵人心的話,叫普通程式員用迴圈,天才程式員用遞歸,咱們就來看看用遞歸怎麼搞咯。
首先以基礎多邊形為初始線,將其炸開,因為後邊要分別對每一根線進行分形操作。
經過ghpython一通操作猛如虎之後,就得到了按遞歸次數分組的分形線,最後將分形線進行join,並分別進行縮放和著色。
#雪花分形 import rhinoscriptsyntax as rs from Grasshopper import DataTree from Grasshopper.Kernel.Data import GH_Path import ghpythonlib.treehelpers as gt #函數1,定義一個對直線等分,移動等分點,連接成折線的函數 def fractal(line): #對直線三等分,得到四個點 pts=rs.DivideCurve(line,3,False,True) #將第三個點以第二個點為中心旋轉-60° pt_rotate=rs.RotateObject(pts[2],pts[1],-60,None,True) #將旋轉後的點插入到等分點列表中索引值為2的位置 pts.insert(2,pt_rotate) #根據點生成多段線,然後將多段線炸開 pl=rs.AddPolyline(pts) pl_ex=rs.ExplodeCurves(pl,True) #返回炸開後的多段線 return pl_ex num=0 #設定初始計數器 lst_data=DataTree[object]() #建立一個空的樹形數據列表 #函數2,調用函數1對直線分形,並將分形數據添加到樹形數據列表,註意路徑號的選擇 #這樣就可以將同一次調用函數2的所有分形線放置在了同一路徑下 def mul_fractal(lines): #全局變數,用來設置路徑號 global num num+=1 lst=[] #對調用函數的所有直線進行遍歷分形,並追加到列表中 for i in lines: lst.extend(fractal(i)) #將列表數據放置到樹形數據中 lst_data.AddRange(lst,GH_Path(num)) return lst #函數3,主函數,用來設置分形次數 def main(lines,count): #如果分形次數為0 ,則直接返回原直線 if count==0: return lines #如果分形次數為1,則作為遞歸出口,返回一次細分後的分形線 if count==1: return mul_fractal(lines) #如果分形次數大於1,則調用主函數自身,分形次數減1,直至分形次數為1,達到遞歸出口 #然後依次返回遞歸分形數據 else: return mul_fractal(main(lines,count-1)) #調用主函數,得到分形線,將初始線添加到分形線樹形數據的第一個分支 fractal_lines=main(lines,count) lst_data.AddRange(lines,GH_Path(0)) #根據樹形數據的分支數進行遍歷 #每一個分支的數據向上進行移動 for i in range(lst_data.BranchCount): rs.MoveObjects(lst_data.Branch(i),(0,0,i*height))