輸入:一些點的坐標;一個測試點
輸出:是否在多邊形內部
思路:
(1)面積和判別法:判斷目標點與多邊形的每條邊組成的三角形面積和是否等於該多邊形,相等則在多邊形內部。
(2)夾角和判別法:判斷目標點與所有邊的夾角和是否為360度,為360度則在多邊形內部。
(3)引射線法:從目標點出發引一條射線,看這條射線和多邊形所有邊的交點數目。如果有奇數個交點,則說明在內部,如果有偶數個交點,則說明在外部。
具體做法:將測試點的Y坐標與多邊形的每一個點進行比較,會得到一個測試點所在的行與多邊形邊的交點的列表。在下圖的這個例子中有8條邊與測試點所在的行相交,而有6條邊沒有相交。如果測試點的兩邊點的個數都是奇數個則該測試點在多邊形內,否則在多邊形外。在這個例子中測試點的左邊有5個交點,右邊有三個交點,它們都是奇數,所以點在多邊形內。
算法圖解:
想法:
1、先求出這些點中的橫縱坐標的最大值和最小值,判斷測試點是否在內部,若不在,則直接排除掉,返回false;
if(p.x<minx || p.x>maxx || p.y<miny ||p.y>maxy)
{
return false;
}
2、核心部分:
循環每一個邊;
被測試點縱坐標testy是否在相鄰兩點縱坐標之內?
待測點testx是否在兩點連線下方,若是,則記錄一次,說明延長線上有一個交點。
最后判斷記錄次數為奇數,則在多邊形內部。

1 int pnpoly(int nvert, float *vertx, float *verty, float testx, float testy) 2 { 3 int i, j, c = 0; 4 for (i = 0, j = nvert-1; i < nvert; j = i++) 5 { 6 if ( ((verty[i]>testy) != (verty[j]>testy)) && 7 (testx < (vertx[j]-vertx[i]) * (testy-verty[i]) / (verty[j]-verty[i]) + vertx[i]) ) 8 c = !c; 9 } 10 return c; 11 }