判斷某個點是否在不規則圖形內

輸入:一些點的座標;一個測試點算法

輸出:是否在多邊形內部ide

思路:測試

(1)面積和判別法:判斷目標點與多邊形的每條邊組成的三角形面積和是否等於該多邊形,相等則在多邊形內部。spa

(2)夾角和判別法:判斷目標點與全部邊的夾角和是否爲360度,爲360度則在多邊形內部。3d

(3)引射線法:從目標點出發引一條射線,看這條射線和多邊形全部邊的交點數目。若是有奇數個交點,則說明在內部,若是有偶數個交點,則說明在外部。code

具體作法:將測試點的Y座標與多邊形的每個點進行比較,會獲得一個測試點所在的行與多邊形邊的交點的列表。在下圖的這個例子中有8條邊與測試點所在的行相交,而有6條邊沒有相交。若是測試點的兩邊點的個數都是奇數個則該測試點在多邊形內,不然在多邊形外。在這個例子中測試點的左邊有5個交點,右邊有三個交點,它們都是奇數,因此點在多邊形內。blog

算法圖解:event

 

想法:class

一、先求出這些點中的橫縱座標的最大值和最小值,判斷測試點是否在內部,若不在,則直接排除掉,返回false;test

if(p.x<minx || p.x>maxx || p.y<miny ||p.y>maxy)

{

  return false;

}

二、核心部分:

  循環每個邊;

  被測試點縱座標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 }
View Code
相關文章
相關標籤/搜索