C語言實現(xiàn)的PNPoly算法代碼例子
寫C語言的實驗用到的一個算法,判斷一個點是否在多邊形的內(nèi)部。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是多邊形頂點的個數(shù),vertx和verty分別是多邊形頂點橫、縱坐標的數(shù)組,textx和testy是待測點的坐標。這個算法是由W. Randolph Franklin提出的,根據(jù)Jordan curve theorem,多邊形將平面分為內(nèi)外兩個區(qū)域,假設(shè)待測點在多邊形內(nèi)部,從待測點引出一條射線必然會與多邊形有至少一個交點。該射線與多邊形第一次相交時將“沖出”多邊形,第二次相交將“進入”多邊形,依此類推,若射線與多邊形有奇數(shù)個交點,則該點在多邊形內(nèi)部,反之則在外部。
PNPoly算法正是從待測點引出一條水平向右的射線,并計算與多邊形的交點個數(shù)。解釋一下這段代碼:for (i = 0, j = nvert-1; i < nvert; j = i++)循環(huán)的含義就是始終讓j = i – 1,如果i = 0那么j = nvert – 1,從而依次檢驗多邊形的每條邊。接下來的重點就是條件語句,(verty[i]>testy) != (verty[j]>testy)很好理解,就是一條邊上的兩個頂點分別在待測點的上方和下方,通過這條語句可以知道從待測點向右引出的射線有可能與該條邊相交(只要待測點在邊的左側(cè)即可)。
但具體判斷相交就要交給解析幾何了。建系寫出該條邊所在直線的方程:
變形一下:
代入待測點坐標,根據(jù)圖形關(guān)系得到這個不等式:
也就是語句testx < vertx[j]-vertx[i]) * (testy-verty[i]) / (verty[j]-verty[i]) + vertx[i]了.
相關(guān)文章
利用C++?OpenCV?實現(xiàn)從投影圖像恢復(fù)仿射特性
我們通過相機拍攝的圖片存在各種畸變,其中投影畸變使得原本平行的直線不再平行,就會產(chǎn)生照片中近大遠小的效果。本文將具體介紹如何利用OPenCV實現(xiàn)從投影圖像恢復(fù)仿射特性,接下來跟著小編一起學(xué)習(xí)吧2021-11-11Qt圖形圖像開發(fā)之曲線圖表模塊QChart庫讀取/設(shè)置X軸的顯示區(qū)間
這篇文章主要介紹了Qt圖形圖像開發(fā)之曲線圖表模塊QChart庫讀取/設(shè)置X軸的顯示區(qū)間,需要的朋友可以參考下2020-03-03linux c 獲得當前進程的進程名和執(zhí)行路徑(示例)
如何得到當前進程的進程名和執(zhí)行路徑。寫了個程序分享一下2013-07-07