判斷一個點是否在給定的凸四邊形內


方法一:

如果一個點在這個凸四邊形內,那么按照順時針方向,該點一定在每條邊的右側。可使用矢量叉積來看:該方法只適用於凸多邊形。

矢量叉積

  計算矢量叉積是與直線和線段相關算法的核心部分。設矢量P = ( x1, y1 ),Q = ( x2, y2 ),則矢量叉積定義為由(0,0)、p1、p2和p1+p2所組成的平行四邊形的帶符號的面積,即:P × Q = x1*y2 - x2*y1,其結果是一個標量。顯然有性質 P × Q = - ( Q × P ) 和 P × ( - Q ) = - ( P × Q )。一般在不加說明的情況下,本文下述算法中所有的點都看作矢量,兩點的加減法就是矢量相加減,而點的乘法則看作矢量叉積。

  叉積的一個非常重要性質是可以通過它的符號判斷兩矢量相互之間的順逆時針關系:

  若 P × Q > 0 , 則P在Q的順時針方向。

  若 P × Q < 0 , 則P在Q的逆時針方向。

  若 P × Q = 0 , 則P與Q共線,但可能同向也可能反向。

 

所以,假設該凸四邊形為ABCD,且ABCD順時針,待判斷的點為M,則需要滿足:

AB × AM>0

BC × BM>0

CD × CM>0

DA × DM>0

即可證明點M在凸四邊形內部。

 

方法二:

 假設該凸四邊形為ABCD,待判斷的點為M,過點M任做一條射線L(起點為M,終點無窮遠)。如果M在凸四邊形內部,則直線L必與四邊形相交,且有一個交點。如果M不在凸四邊形內部,則L可與四邊形相交也可能不相交,相交的情況有兩種,一個交點(過四邊形的頂點),或者兩個交點。如下:

過點M任做一條射線L,判斷交點個數,奇數個則M點在內部,反之在外部。這個適用於多邊形以及凹多邊形。

 

方法三:

如果M在ABCD內部,則ABCD任意一點和M所構成的向量在改點所在邊的中間,即叉積的乘積<0。如下:

AB × AM  * AM × AD<0

BC × BM  * BM × BA<0

CD × CM * CM × CB<0

DA × DM * DM × DC<0

方法四:

點M若在ABCD內部,則M與ABCD任意二點構成的三角形面積之和等於ABCD的面積,否則大於ABCD的面積。

計算AMB、BMC、CMD、DMA的面積和,並與ABCD的面積相比較。


免責聲明!

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



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