射線法判斷點和多邊形的位置


通過射線法判斷點和多邊形的位置關系.適用於任意多邊形.

        射線法:從目標點引出一條射線,查看和多邊形有多少個交點.如果交點是奇數個,說明在多邊形內部,否則在多邊形外部.(在多邊形上的情況,在計算中可以算出來,這里不說明這種情況.)

        圖中,假設黑色為引出的射線.(因為在給出坐標的情況下,使用x=x0或y=y0的射線便於計算交點)其它線段是多邊形的邊和射線的可能位置情況.(還有兩點都在射線的上方或者下方,只需要判斷)

      1. AB:兩點都在射線起始點的左側.這種情況下,射線一定不會和這條邊有交點

      2. AC,AD:A在射線起始位置左側下方,C在射線起始位置右側上方

      3. DE:均在射線起始點右側,一個在上方,一個在下方.

      4. FG,HI:特殊情況,多邊形的頂點在射線上.

      5. 其它情況:射線起始點在多邊形邊上/頂點上;多邊形的邊和射線平行/多邊形的點全部在射線的一側.

      這里使用y=y0的射線對各種情況的判斷進行說明.

      1.判斷給出的多邊形兩點的x坐標如果都在射線頂點左側,不計數,直接判斷下一條邊.

      2.這種情況不能僅根據坐標本身判斷邊是否和射線相交.這種情況下,列出直線方程進行計算.

          如果:

                 交點比射線起點x坐標大,說明有交點.

                 交點和起點x坐標相等,說明起點在多邊形上

                 交點比射線起點x坐標小,說明沒有交點

     3.判斷邊的y坐標在射線兩側,x坐標都比射線起點大,直接進行計數,不再求交點

     4.這種情況特殊.

        針對FG,HI.它們的下一條邊的情況可能是虛線的兩種.這里認定在射線上的點均為在射線上方.(當然也可以認定為在射線下方,不過只需認定一種情況) 這樣的話,對於FG,是與射線相交的,HI是與射線不相交的.

        進行這樣認定的原因,可以分析一下它下一條邊的情況.針對FG.認定了G在射線上方.那么下一條邊如果是下方的虛線,那么這條邊會被判斷為不在射線上;如果是上方的虛線,則可以判斷為在射線上.--------認定G在射線下方,仍然能夠得出相同結論:如果下一條邊是上方虛線,可以判斷多邊形和射線有交點;是下方虛線,可以判斷為多邊形和射線沒有交點.

     5.這種情況均不進行交點計數.

 

     總結:判斷邊上的點的y坐標是否在射線兩側,如果在射線兩側:

                   判斷交點和射線起始點的x0的大小.(實際上可以將一些情況區分出來,不計算交點,不過使用方程計算交點,就不需要考慮很多情況了)

 

偽代碼:

      (x0,y0),<(x1,y1),(x2,y2)>

      cnt=0;

     graphArray

     for(graphArray){

         if(y1<=y0&&y2>y0 || y1>y0&&y2<=y0){//這里是上面描述的第四種情況里的HI情況.

             int crossX = 0;

             if(x1 == x2){

                 crossX = x1;

             }

             else{

                 crossX = line(point1,point2,y0)//point1,point2組成的直線和射線y0的交點

             }

             if(crossX>x0){

                  cnt++;

             }

         }

    }

    if(cnt%2 == 1){

       點在多邊形內

     }

    

參考代碼:


http://www.reclusiveone.com/archives/27/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM