1. 程式人生 > >判斷一個點是否在給定的凸四邊形內

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

方法一:

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

向量叉積

  計算向量叉積是與直線和線段相關演算法的核心部分。設向量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的面積相比較。