「判斷乙個點是否在乙個多邊形裡」,一開始以為是個挺難的問題,但google了一下之後發現其實蠻簡單,所用到的演算法叫做「ray-casting algorithm」,中文應該叫「光線投射演算法」,這是維基百科的描述:[維基百科]
簡單地說可以這麼判斷:從這個點引出一根「射線」,與多邊形的任意若干條邊相交,累計相交的邊的數目,如果是奇數,那麼點就在多邊形內,否則點就在多邊形外。
如圖,a點引一條射線,與多邊形3條邊相交,奇數,所以a點在多邊形內,而從b點引一條射線,與多邊形的2條邊相交,偶數,所以b點在多邊形外。
我打算把這個演算法用於判斷地圖上所在的位置是否在乙個範圍之內,我先用滑鼠在地圖上繪製出乙個多邊形區域,然後再用這個方法判斷乙個座標是否在這個多邊形範圍內,我仍然拿五角星做試驗品,在高德地圖上描出乙個五角星:
嗯?怎麼五角星居然中間沒被鏤空?這是怎麼回事?經過研究,我發現高德地圖的滑鼠工具的多邊形填充用的是另外一套規則,叫做「none zero mode」,判斷乙個點是否在多邊形內的規則就變成了:從這個點引出一根「射線」,與多邊形的任意若干條邊相交,計數初始化為0,若相交處被多邊形的邊從左到右切過,計數+1,若相交處被多邊形的邊從右到左切過,計數-1,最後檢查計數,如果是0,點在多邊形外,如果非0,點在多邊形內。回到五角星的例子,這次要注意多邊形線條描繪的方向:
從c點引出一條射線,與這條射線相交的兩條多邊形的邊均是從左向右切過,總計數是2,因此c點在多邊形內。用個更形象點的方式描述就是:從c點出發,一直朝乙個方向走,遇到兩條單行道,都是從自己的左邊切至右邊的方向,計數+1,計數+1,總計數所以是2。
演算法實現起來居然很簡單,幾行**即可,真的是幾行**,我用的是c#,大家可以輕輕鬆鬆改成別的。
public我用wpf寫了個demo,如圖:static
class
raycastingalgorithm
int j = ptnum - 1
;
bool oddnodes = false
;
int zerostate = 0
;
for (int k = 0; k < ptnum; k++)
else
}j =k;
}return nonezeromode?zerostate!=0
:oddnodes;}}
給懶得敲打嗎的同學玩玩。(vs2015)
判斷乙個點是否在多邊形中
例項 1 圖 1是乙個典型的14邊形,紅點為測試點,判斷該紅點是否在14邊形中。解決方法 穿過紅點,做一條平行於x軸的水平線,於14邊形共有8個交點,如果,在紅點的左右兩邊各有奇數個交點,那麼在多邊形中 如果,左右兩邊各有偶數個交點,那麼不在多邊形中 圖 2 例項 2 多邊形是交叉的且封閉的。如圖二...
判斷乙個點是否在多邊形內部
判斷乙個點是否在多邊形內部 三角形的有向面積 我們先判斷乙個點是否在乙個三角形內部。乙個三角形在乙個座標系 譬如由a b c三點組成 中,我們可以通過計算它的有向面積來判斷a b c三點在座標系中的順逆。當然,在此之前我們必須先訂立一套計算面積的規則。比如,在笛卡爾座標系中,我們利用 s a.x b...
判斷乙個點是否在多邊形內
演算法 如果是凸多邊形,我覺得這樣很方便 1 在多邊形內任取一點a 比如是某對角線的中點,如果是三角形則取某中線的中點 2 判斷未知點 設為b 與a是否在任何一條邊的同側。方法簡單有效 設任一邊的直線方程為 y ax b 令f x ax b y 只需判斷f a f b 0 a,b同側 0 在邊上 0...