判斷乙個點是否在多邊形中

2021-06-15 09:36:13 字數 1799 閱讀 6043

例項-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 中文應該叫 光線投射演算法 這是維基百科的描述 維基百科 簡單地說可以這麼判斷 從這個點引出一根 射線 與多邊形的任意若干條邊相交,累計相交...