在講解之前,我必須說這是不得以下的下下之策.
基本上gh比較偏單向度的輸出,比較不能做for loop,
也就是假如有一個流程,你只需丟一個參數去讓它跑出結果後,
它可以把結果自動再丟回流程內再跑一次.
當然有問題自然有高手解決,
於是有人寫了給gh做for loop的電池,Hoop Snake
點我看Hoop Snake
在參詳多日之後,我依然只能做出簡單的for loop,
並不能做出我需要的random tatami,
也就是每次丟一張tatami進範圍內,
計算剩哪裡可放之後才丟下一張.
當然有問題自然有高手解決,(跳針
於是有人以hoop snake寫了類似我要做的random tatami,
只是人家叫做random tiling
點我看Random Tiling
在再度參詳多日之後,我只能說一個for loop後面接了一條龍,
真的是讓我心有餘而力不足,完全不明究理.
所以在別無他法下,我只能嘗試以現有的電池來接看看能不能達到類似的效果,以下.
因為知道tatami的長寬比都是2:1,所以先以正方形網格來構成範圍.
先整理出所有偶數格.
隨機選取其中幾格.
(當然選的格數跟你決定的縱向或橫向的tatami佔總面積的多少有關)
將所選格與其上格相合則我們得到縱向的tatami A.
可是現有的tatami都是以偶數格加上格,並沒有以奇數格加上格的.
所以我們列出所有的奇數格,除了本身或是其上格會重疊到現有tatami的奇數格需要去除外,
最上一排的奇數格也不合規範,因為它們上面沒有格子可加,所以也一併去除.
剩下的奇數格就是可以操做的格.
再任意選其中幾格.
將它們與各自上格相合,則我們會得到縱向的tatami B.
剩下的這些格就是要用來放橫向tatami的格.
以剩餘格向右移一格,所以如果沒有重疊到現存tatami的格代表除了它以外,
其左格也是空的,也就是可被運用的格.
經過篩選後,這些格就是可運用為基準的格.
任意選其種幾格.
此時我們可以看到格47與格55是相鄰的,
代表到時它門各自與其左格相合時會有格重覆到,
即格39,47與格47,55會共用格47,
所以這是需要被解決的問題.
因為我們知道每格只會與其左格相合,
所以照理來說當其右移一格時它本身曾為空格,
但我們可以看到當右移一格時55仍被使用,
所以我們知道格55是需被移除的.
在經過篩選後,剩餘的格即是橫向tatami的基礎格.
把它們各自與其左格相合,即可得橫向tatami C.
如果只有縱橫兩種tatami的話,
應該控制成沒有剩餘格,
也就是前面的規則要訂的更細,
不過我個人需要半格的tatami D才設成有剩餘格,
也就是一半的褟褟米(通稱半疊).
因此無論剩餘格有無相聯,它們都會自成一格.
----------------------------------------------------------------------------------
結論就是以gh內的set difference與set intersection來進行不斷的篩選.
如果想要橫向tatami先怎麼辦?
那只要單純在畫完網格時先flip matrix再flatten,
則本來垂直的0123456就變成橫向的.
以下是短片與gh載點(0.8.0061以前的版本不能開)
我是GH載點
----------------------------------------------------------------------------------
這絕對不是最聰明的解法,
所以如果你能用hoop snake或更聰明的接法達到一樣的目的,
拜託!與我分享,plzplzplzplzplzplzplzplzplzplz. :-x
沒有留言:
張貼留言