例項-1
圖-1是乙個典型的14邊形,紅點為測試點,判斷該紅點是否在14邊形中。
解決方法: 穿過紅點,做一條平行於x軸的水平線,於14邊形共有8個交點,
如果,在紅點的左右兩邊各有奇數個交點,那麼在多邊形中;
如果,左右兩邊各有偶數個交點,那麼不在多邊形中;
(圖-2)
例項-2
多邊形是交叉的且封閉的。如圖二所示是乙個交叉且封閉的十邊形,重疊部分可以理解為和異或一樣,兩邊交點相互抵消。例項1中演算法仍然有效。
(圖形-3)
例項-3
在這種情況下,這個六邊形本身不重疊,但有交叉邊,演算法仍然有效;
(圖形-4)
例項-4
如圖-4 所示水平線恰好穿過頂點,因為這個頂點只能屬於乙個邊。一條邊的始末端,都在水平線上或者以上,則這個邊與水平線無交點,如果始末端其中有乙個在水平線上,另乙個在水平線以下,則這條邊和水平線有交點。即如圖-4所示,a邊與水平線有交點而b邊沒有。
所以紅點左右兩邊還是只有奇數個交點,紅點在多邊形中。
例項-5
如圖-5 所示,水平線剛好和其中乙個邊重合。 和圖形-4一樣,邊c和水平線有乙個交點,因為邊d的始末端都是on-or-above水平線上所以沒有交點,邊e始末端乙個在水平線上乙個在之上,所以也沒交點,所以水平線與多邊形左右兩邊個只有乙個交點。紅點在多邊形中。
(圖-6)
例項-6
上面的圖形中,在測試點兩邊各有乙個交點,所以測試點在圖形中,下面的圖形中,左右兩邊各有三個交點,所以測試點在多邊形中;
我們設定,在邊上的點不在多邊形中,(當然也可以設定為在多邊形中)
測試**如下:
/**
* *
* @author quzhu.wl 2013-7-9下午08:42:19
*/public class polygontest ;
int polyy = ;
int x = 30, y = 30;
polygontest polygontest = new polygontest();
boolean innot = polygontest.pointinpolygon(polyx, polyy, x, y);
if(innot) else }
/*** int polyx 為所有頂點的x座標,
* int polyy為所有頂點y座標,
* int x, int y,測試點的x,y座標
*/public boolean pointinpolygon(int polyx, int polyy, int x, int y)
j = i;
} return oddnodes;
}}
判斷乙個點是否在多邊形內部
判斷乙個點是否在多邊形內部 三角形的有向面積 我們先判斷乙個點是否在乙個三角形內部。乙個三角形在乙個座標系 譬如由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...
判斷乙個點是否在乙個多邊形裡
判斷乙個點是否在乙個多邊形裡 一開始以為是個挺難的問題,但google了一下之後發現其實蠻簡單,所用到的演算法叫做 ray casting algorithm 中文應該叫 光線投射演算法 這是維基百科的描述 維基百科 簡單地說可以這麼判斷 從這個點引出一根 射線 與多邊形的任意若干條邊相交,累計相交...