C語(yǔ)言實(shí)現(xiàn)的PNPoly算法代碼例子
寫C語(yǔ)言的實(shí)驗(yàn)用到的一個(gè)算法,判斷一個(gè)點(diǎn)是否在多邊形的內(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是多邊形頂點(diǎn)的個(gè)數(shù),vertx和verty分別是多邊形頂點(diǎn)橫、縱坐標(biāo)的數(shù)組,textx和testy是待測(cè)點(diǎn)的坐標(biāo)。這個(gè)算法是由W. Randolph Franklin提出的,根據(jù)Jordan curve theorem,多邊形將平面分為內(nèi)外兩個(gè)區(qū)域,假設(shè)待測(cè)點(diǎn)在多邊形內(nèi)部,從待測(cè)點(diǎn)引出一條射線必然會(huì)與多邊形有至少一個(gè)交點(diǎn)。該射線與多邊形第一次相交時(shí)將“沖出”多邊形,第二次相交將“進(jìn)入”多邊形,依此類推,若射線與多邊形有奇數(shù)個(gè)交點(diǎn),則該點(diǎn)在多邊形內(nèi)部,反之則在外部。
PNPoly算法正是從待測(cè)點(diǎn)引出一條水平向右的射線,并計(jì)算與多邊形的交點(diǎn)個(gè)數(shù)。解釋一下這段代碼:for (i = 0, j = nvert-1; i < nvert; j = i++)循環(huán)的含義就是始終讓j = i – 1,如果i = 0那么j = nvert – 1,從而依次檢驗(yàn)多邊形的每條邊。接下來(lái)的重點(diǎn)就是條件語(yǔ)句,(verty[i]>testy) != (verty[j]>testy)很好理解,就是一條邊上的兩個(gè)頂點(diǎn)分別在待測(cè)點(diǎn)的上方和下方,通過(guò)這條語(yǔ)句可以知道從待測(cè)點(diǎn)向右引出的射線有可能與該條邊相交(只要待測(cè)點(diǎn)在邊的左側(cè)即可)。
但具體判斷相交就要交給解析幾何了。建系寫出該條邊所在直線的方程:
變形一下:
代入待測(cè)點(diǎn)坐標(biāo),根據(jù)圖形關(guān)系得到這個(gè)不等式:
也就是語(yǔ)句testx < vertx[j]-vertx[i]) * (testy-verty[i]) / (verty[j]-verty[i]) + vertx[i]了.
 
欄 目:C語(yǔ)言
下一篇:C++類模板與模板類深入詳解
本文標(biāo)題:C語(yǔ)言實(shí)現(xiàn)的PNPoly算法代碼例子
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/3611.html
您可能感興趣的文章
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用函數(shù)刪除字符
 - 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)式函數(shù)庫(kù)
 - 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
 - 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)數(shù)怎么表達(dá)
 - 04-02c語(yǔ)言用函數(shù)寫分段 用c語(yǔ)言表示分段函數(shù)
 - 04-02c語(yǔ)言編寫函數(shù)冒泡排序 c語(yǔ)言冒泡排序法函數(shù)
 - 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
 - 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段函數(shù)
 - 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎么打出三角函數(shù)的值
 - 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求階乘
 


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
 - 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
 - 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
 - 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
 - 5c語(yǔ)言計(jì)算三角形面積代碼
 - 6什么是 WSH(腳本宿主)的詳細(xì)解釋
 - 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
 - 8正則表達(dá)式匹配各種特殊字符
 - 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
 - 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
 
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
 - 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
 - 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
 - 04-02c語(yǔ)言用函數(shù)寫分段 用c語(yǔ)言表示分段
 - 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
 - 04-02c語(yǔ)言編寫函數(shù)冒泡排序 c語(yǔ)言冒泡排
 - 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
 - 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
 - 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
 - 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
 
隨機(jī)閱讀
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
 - 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
 - 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
 - 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
 - 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
 - 01-10C#中split用法實(shí)例總結(jié)
 - 04-02jquery與jsp,用jquery
 - 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
 - 01-10delphi制作wav文件的方法
 - 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
 


