如何在不規則多邊形內均勻撒點的算法

原文地址: https://geekplux.com/2018/03/16/how-to-picking-uniform-points-in-irregular-polygon.html

給定一個不規則的多邊形(多是凹多邊形,多是凸多邊形),在其中要顯示拓撲網絡數據,要求節點不重合、不超出邊界。html

該問題出現的場景:

  • 在地圖上撒點
  • 在未知畫布上生成初始的拓撲佈局

解決方案:

方法一 隨機撒點

取凸多邊形的外接矩形,在矩形中隨機撒點,若是落在凸多邊形外,再次隨機撒點,直至落在凸多邊形內。
這個方法比較暴力,能夠經過計算指望來控制撒點次數,撒點次數應該符合泊松分佈。git

方法二 把不規則多邊形切割成若干三角形

能夠看做方法一的改進。切成多個三角形以後,問題轉化爲了如何在多個三角形內撒點。github

參考:https://beta.observablehq.com...
切割庫:https://github.com/mapbox/earcut算法

earcut 切割效果

三角形是凸多邊形,如何在三角形內均勻撒點可參考:http://mathworld.wolfram.com/...網絡

算法步驟:dom

  1. 隨機選取任意一三角形
  2. 在三角形內撒點
  3. 重複 12,直到點撒完

這裏有個問題*:每一個三角形被選取的機率相同,但三角形面積不一樣。這就可能出現小面積三角形中的點和大面積三角形中的點個數差很少,從而形成整體上看起來點集中在小面積三角形中的狀況。
因此要保證三角形被選取的機率跟它的面積成正比佈局

方法三 用力導向迭代

能夠看做是 方法二 的改進。給隨機撒好的點設置相同的電荷力,使其不停迭代到穩定狀態,即造成下圖狀態,達到儘可能「均勻」。spa

參考:https://bl.ocks.org/mbostock/...orm

力導向迭代效果

方法四 用四叉樹生成點

和前三種方法無關。用四叉樹將二維空間切割成相等大小的正方形,而後用正方形圖心撒點。htm

參考:https://www.phase2technology....

四叉樹效果
四叉樹效果


本做品採用知識共享 署名-非商業性使用-禁止演繹 4.0 國際 許可協議進行許可。

相關文章
相關標籤/搜索