原文地址: https://geekplux.com/2018/03/16/how-to-picking-uniform-points-in-irregular-polygon.html給定一個不規則的多邊形(可能是凹多邊形,可能是凸多邊形),在其中要顯示拓撲網絡數據,要求節點不重合、不超出邊界。
該問題出現的場景:
- 在地圖上撒點
- 在未知畫布上生成初始的拓撲布局
解決方案:
方法一 隨機撒點
取凸多邊形的外接矩形,在矩形中隨機撒點,如果落在凸多邊形外,再次隨機撒點,直至落在凸多邊形內。
這個方法比較暴力,可以通過計算期望來控制撒點次數,撒點次數應該符合泊松分布。
方法二 把不規則多邊形切割成若干三角形
可以看作方法一的改進。切成多個三角形之后,問題轉化為了如何在多個三角形內撒點。
參考:https://beta.observablehq.com...
切割庫:https://github.com/mapbox/earcut
三角形是凸多邊形,如何在三角形內均勻撒點可參考:http://mathworld.wolfram.com/...
算法步驟:
- 隨機選取任意一三角形
- 在三角形內撒點
- 重復 12,直到點撒完
這里有個問題*:每個三角形被選取的概率相同,但三角形面積不同。這就可能出現小面積三角形中的點和大面積三角形中的點個數差不多,從而造成總體上看起來點集中在小面積三角形中的情況。
所以要保證三角形被選取的概率跟它的面積成正比。
方法三 用力導向迭代
可以看作是 方法二 的改進。給隨機撒好的點設置相同的電荷力,使其不停迭代到穩定狀態,即形成下圖狀態,達到盡量“均勻”。
參考:https://bl.ocks.org/mbostock/...
方法四 用四叉樹生成點
和前三種方法無關。用四叉樹將二維空間切割成相等大小的正方形,然后用正方形圖心撒點。
參考:https://www.phase2technology....
本作品采用知識共享 署名-非商業性使用-禁止演繹 4.0 國際 許可協議進行許可。