判斷點在多邊形內 射線法詳解

2022-08-05 17:30:24 字數 1101 閱讀 1068

現有一個點p(x0,y0),多變形ptpolypon,判斷點p是否在多邊形內。

判斷一個點是否在多邊形內,我們可以從該點引出一條水平射線(任意射線都可,但水平便於計算),觀察射線與多變形的交點個數,如果交點個數為奇數,則該點在多邊形內,如果為偶數則在多邊形外。

如圖 點在多邊形內,從該點做一條水平射線,與多邊形交點個數為2*n+1 為奇數,同理若點在多變形外為偶數。

如何判斷水平射線與多變形的邊有交點呢?

顯然,如果某條邊是水平的,那麼肯定沒有交點

if (p1.y == p2.y) continue;

如果點p的縱座標比多邊形某邊的縱座標都小或都大,那麼他們的交點一定在延長線上,如圖所示

if (p.y < min(p1.y, p2.y))

continue;

if (p.y >= max(p1.y, p2.y))

continue;

接下來我們考慮一般情況。要想判斷有沒有交點,我們只需要將多邊形某邊所在直線的方程求出,將p點的縱座標y0帶入,即可求得交點橫座標x,將x與x0比較,如果下x0

\[x = (y0- p1.y)*(p2.x - p1.x)/ (p2.y - p1.y)+ x0

\]

struct point

;bool isinpolygon(point p,point *ptpolygon,int ncount)

return(ncross % 2 == 1);

}