我有一個500 x 400px的正方形,裏面有100px的網格。現在我想用那個與網格對齊的較小的隨機大小的正方形填充該正方形。這意味着較小的正方形可以是100,200,300或400像素的大小。它們的大小和位置必須是隨機的,因此每次運行時輸出都會有所不同。將網格劃分成隨機大小的矩形
此圖顯示了大方形,它的網格,以及可能的輸出以及我試圖創建的小方塊。
我用Ruby /西納特拉與DIV的產生,但我想這個問題是更普遍的趨向實際的算法使用。
有關如何以最少量的代碼做到這一點的任何建議?
我有一個500 x 400px的正方形,裏面有100px的網格。現在我想用那個與網格對齊的較小的隨機大小的正方形填充該正方形。這意味着較小的正方形可以是100,200,300或400像素的大小。它們的大小和位置必須是隨機的,因此每次運行時輸出都會有所不同。將網格劃分成隨機大小的矩形
此圖顯示了大方形,它的網格,以及可能的輸出以及我試圖創建的小方塊。
我用Ruby /西納特拉與DIV的產生,但我想這個問題是更普遍的趨向實際的算法使用。
有關如何以最少量的代碼做到這一點的任何建議?
這種方法將採取大量的代碼,但我想我會用高德納的舞蹈鏈算法(DLX)(或其他算法)來查找平方所有可能的安排去做。您可以提前計算安排,然後在需要時可以快速/隨機選擇。
你可以在這裏閱讀他對算法及其pentominoes應用(這是非常相似,你的問題)紙張:
http://www-cs-faculty.stanford.edu/~uno/papers/dancing-color.ps.gz
一個簡單的遞歸方法可以產生一個相當不錯的隨機分佈,像這樣:作爲基本情況,任何100x100的網格都必須填充100x100的正方形。否則,如果網格對於某個n足夠小以容納一個正方形,則可以選擇使用該大小的正方形來平鋪網格。否則,選擇不是100的矩形的一邊,挑選一個100的倍數的隨機地方,然後將其分成兩半,遞歸地平鋪兩邊。
此方法的主要優點是,您永遠不必跟蹤放置較舊矩形的位置,以避免擊中它們。您始終使用空矩形,並以確保區域永不重疊的方式遞歸地細分問題。
這可能不總是給出好的結果,但它很容易編碼(我假設可能總共有15-25行代碼),並且可以很容易地進行調整來改變輸出。
希望這會有所幫助!
給出一個正方形,也有數量有限放置它的地方。如果你不擔心速度:產生隨機平方尺寸達到某個最大值;獲取所有可能的地方放置它;隨機選擇一個並放置它。如果沒有可能的地方,請減小最大尺寸。 – Timbits