很明顯,你需要生成你的Voronoi圖來約束更大的多邊形。雖然您將它稱爲多邊形,但我注意到您的示例圖具有基於樣條線的邊。現在讓我們忘記。
你想要做什麼是確保你開始與具有相當的長度相等邊緣的含多邊形(無論是通過您或從另一個源產生的);方差因素會使這看起來更自然。我可能會去10-20%的差異。
現在,您已經將包含多邊形的線劃分爲長度大致相等的線段,您可以從中開始生成Voronoi圖。對於您的容器上的每個邊緣:
- 確定邊緣法線(從該線段中心向內突出的perp線)。
- 使用邊緣法線作爲放置新Voronoi節點中心的滑動比例。距離邊緣本身的距離將取決於您希望您的平均Voronoi單元「直徑」是多少,如果它們都被視爲圓形。在你的例子中,看起來像30像素(或者你的世界單位中的任何等效物)。再次,你應該應用一個方差因子,以便不是每個細胞中心都與其源邊等距。
- 爲您新放置的中心生成Voronoi單元格。
- 將您的Voronoi單元源點存儲在列表中。
隨着您逐漸生成每個點,您應該開始看到該算法以徑向方式細分凹形容器的每個凸面「構成區域」。
您可能想知道該列表是什麼。很顯然,你還沒有完成,你只產生了你想要的總Voronoi鑲嵌的一小部分。一旦創建了凹面空間的這些「邊界」單元,就不希望新邊界單元比邊界單元更接近邊界,只需要它們在該區域內。通過維護邊界單元源點的列表,您可以確保您創建的任何其他點位於的區域內。這有點像拿一個內部閔可夫斯基和來確保你有一個緩衝區。現在你可以在這個派生的凹空間中隨機化剩下的細胞,直到完成。如果任何「通道」區域太窄,那麼這個派生空間的邊界將會重疊,你將會得到一個非簡單的多邊形,並且你將會得到一個非簡單的多邊形。可能會發現自己在錯誤的地方放置點,儘管你付出了努力,解決方法是確保你的最大放置距離不會超過最小通道寬度的一半......或者使用其他幾何方法,包括Minkowski總結作爲一種可能性,以確保你不會結尾退化衍生多邊形。很可能你會以多面體結束,即碎片。)
我還沒有應用此方法,但儘管肯定會出現一些錯誤,我認爲他的一般想法會讓你開始朝正確的方向發展。
+1對於可視化 – Johan