一、射線法
從需要判斷的點向任意方向引一條射線,計算與多邊形交點的個數,如果是偶數或0,則點在多邊形外,如果是奇數,則點在多邊形內,若點在多邊形的邊上,則需要做特殊判斷。
二、**思路
1、從需要判斷的點向x軸負方向引一條射線,判斷多邊形的每一條邊與這條射線是否有交點。需判斷的點為point p, 多邊形頂點存在vectorvpoint中,射線為 y = p.y。
2、對每一條邊的兩個頂點分別記為vpoint[i]和vpoint[j],(vpoint[i].y < p.y && vpoint[j].y >= y) || (vpoint[i].y >= y && vpoint[j].y < y)保證了射線在多邊形這條邊的y值範圍內,vpoint[i].x <= p.x || vpoint[i] <= p.x刪掉了一些肯定在需判斷的點右邊的多邊形的邊。
3、vpoint[i]和vpoint[j]這兩個頂點構成的邊上y = p.y的點的x值可以通過公式x = vpoint[i].x + (y - vpoint[i].y) / (vpoint[j].y - vpoint[i].y) * (vpoint[j].x - vpoint[i].x)計算得(高中所學,具體圖示見該**:
4、若計算出的x等於p.x,那麼需判斷的點就在多邊形的邊上;若計算出的x小於p.x,說明多邊形的邊在需判斷的點的左邊,該點引出的射線與多邊形的邊有交點;若大於,則沒有交點。
5、用bool值變數inside來進行異或操作,每有乙個交點,值就發生變化。
三、注意
1、(vpoint[i].y < p.y && vpoint[j].y >= y) || (vpoint[i].y >= y && vpoint[j].y < y)保證了公式x = vpoint[i].x + (y - vpoint[i].y) / (vpoint[j].y - vpoint[i].y) * (vpoint[j].x - vpoint[i].x)中作為除數的(vpoint[j].y - vpoint[i].y)定不會為0(若vpoint[j].y 和vpoint[i].y相等,進不了if語句)。
2、射線經過多邊形的頂點不影響結果:當射線經過多邊形的頂點時,若與頂點相連的兩條邊在射線下方,則會得出射線與該頂點相交2次;若與頂點相連的兩條邊在射線上方,則會得出射線與頂點相交0次。這是由**(vpoint[i].y < p.y && vpoint[j].y >= y) || (vpoint[i].y >= y && vpoint[j].y < y)造成。若**改為(vpoint[i].y <= p.y && vpoint[j].y > y) || (vpoint[i].y > y && vpoint[j].y <= y)則會當在射線上方時相交2次,下方時相交0次。具體的圖見該**:
四、c/c++**
#include #include #include using namespace std;
typedef struct point
;int count; //與多邊形交點個數
//判斷點是否在多邊形內(以該點為起點沿x軸負方向做一條射線)
bool ispointinpolygon(point p, vectorvpoint)
else
btmp = (dtmp < x);
inside ^= btmp;
if(btmp)
count++;
} j = i;
} return inside;
}int main()
scanf("%lf %lf", &p.x, &p.y); //輸入需要判斷的點
count = 0;
if(ispointinpolygon(p, vpoint))
printf("yes!\n");
else
printf("no!\n");
printf("%d\n", count); //輸出與多邊形交點的個數
return 0;
}
判斷乙個點是否在多邊形內部 射線法思路
判斷乙個點是否在多邊形內部 1 射線法思路 判斷乙個點是否在多邊形內部 2 射線法實現 比如說,我就隨便塗了乙個多邊形和乙個點,現在我要給出一種通用的方法來判斷這個點是不是在多邊形內部 別告訴我用肉眼觀察 首先想到的乙個解法是從這個點做一條射線,計算它跟多邊形邊界的交點個數,如果交點個數為奇數,那麼...
判斷乙個點是否在多邊形內
演算法 如果是凸多邊形,我覺得這樣很方便 1 在多邊形內任取一點a 比如是某對角線的中點,如果是三角形則取某中線的中點 2 判斷未知點 設為b 與a是否在任何一條邊的同側。方法簡單有效 設任一邊的直線方程為 y ax b 令f x ax b y 只需判斷f a f b 0 a,b同側 0 在邊上 0...
判斷乙個點是否在多邊形內部 2 射線法實現
原文出處 看過上一次的思路講解後,不知道大家思考得怎麼樣,有沒有遇到一些不好處理的特殊情況。今天就來講講射線法在實際應用中的一些問題和解決方案。點在多邊形的邊上 前面我們講到,射線法的主要思路就是計算射線穿越多邊形邊界的次數。那麼對於點在多邊形的邊上這種特殊情況,射線出發的這一次,是否應該算作穿越呢...