C語言實現的PNPoly演算法代碼例子_C 語言

來源:互聯網
上載者:User

寫C語言的實驗用到的一個演算法,判斷一個點是否在多邊形的內部。C的代碼如下:

int pnpoly(int nvert, float *vertx, float *verty, float testx, float testy){  int i, j, c = 0;  for (i = 0, j = nvert-1; i < nvert; j = i++) {    if ( ((verty[i]>testy) != (verty[j]>testy)) &&       (testx < (vertx[j]-vertx[i]) * (testy-verty[i]) /       (verty[j]-verty[i]) + vertx[i]) )      c = !c;    }  return c;}

其中nvert是多邊形頂點的個數,vertx和verty分別是多邊形頂點橫、縱座標的數組,textx和testy是待測點的座標。這個演算法是由W. Randolph Franklin提出的,根據Jordan curve theorem,多邊形將平面分為內外兩個地區,假設待測點在多邊形內部,從待測點引出一條射線必然會與多邊形有至少一個交點。該射線與多邊形第一次相交時將“衝出”多邊形,第二次相交將“進入”多邊形,依此類推,若射線與多邊形有奇數個交點,則該點在多邊形內部,反之則在外部。

PNPoly演算法正是從待測點引出一條水平向右的射線,並計算與多邊形的交點個數。解釋一下這段代碼:for (i = 0, j = nvert-1; i < nvert; j = i++)迴圈的含義就是始終讓j = i – 1,如果i = 0那麼j = nvert – 1,從而依次檢驗多邊形的每條邊。接下來的重點就是條件陳述式,(verty[i]>testy) != (verty[j]>testy)很好理解,就是一條邊上的兩個頂點分別在待測點的上方和下方,通過這條語句可以知道從待測點向右引出的射線有可能與該條邊相交(只要待測點在邊的左側即可)。

但具體判斷相交就要交給解析幾何了。建系寫出該條邊所在直線的方程:

變形一下:

代入待測點座標,根據圖形關係得到這個不等式:

也就是語句testx < vertx[j]-vertx[i]) * (testy-verty[i]) / (verty[j]-verty[i]) + vertx[i]了.
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.