文章版權由作者李曉暉和博客園共有,若轉載請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/
1. 背景
任意多邊形內部一定有一個最大圓,但是如果我們將條件設定為“任意多邊形”、“最大圓”,該算法將十分復雜。比如獲取多邊形內任意點進行膨脹、通過碰撞檢測來進行判定,算法復雜且效率低下。
回到實際項目本身,需求為判斷點是否落在規划的電子圍欄內。觀察電子圍欄,多數是凸多邊形。而我們之所以要求內部圓,是因為單純通過外包矩形可以過濾掉的點十分有限,並且即使點落在外包矩形內后,依然不能肯定點是否落在多邊形內,還是要做一次點和多邊形關系的判斷。考慮到實際情況中點落在多邊形內是大概率事件,這將導致點面關系的判斷十分頻繁。而如果我們內部構造出一個圓,這個圓足夠大,則可以先進行點是否在圓內的簡單判斷。如果這個圓可以占多邊形50%的空間,則可以避免百分之五十的點和多邊形的判斷。那么這個圓需要是最大么,考慮到算法代價,似最大便足夠。
總結這個需求,我將其簡化為,求凸多邊形內部的似最大圓。
2.算法設計
求出多邊形的重心為圓心,獲取重心到各邊垂直距離中的最短距離為半徑。
2.1獲取重心
重心的獲取有兩個方法:
a.各頂點的平均值。
b.考慮面積加權,將多邊形切分為各三角形,通過平面薄板重心公式把積分變成累加和:
2.2獲取半徑
以重心為原點,與各個邊相連,將多邊形划分為多個三角形,求出該頂點到三角形對邊的垂直距離。
a.利用海倫公式算出三角形的面積。
b.利用三角形面積和邊的長度,算出原點到對邊的垂直距離。
c.遍歷此運算,得出“高”中的最短高(距離)。
3.補充多邊形凹凸關系判斷
由於該算法主要針對凸多邊形,所以需要對多邊形進行凹凸判斷。判斷思路為角度合算法。
4.實現
-----歡迎轉載,但保留版權,請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/
如果您覺得本文確實幫助了您,可以微信掃一掃,進行小額的打賞和鼓勵,謝謝 ^_^