方法一:
如果乙個點在這個凸四邊形內,那麼按照順時針方向,該點一定在每條邊的右側。可使用向量叉積來看:該方法只適用於凸多邊形。
向量叉積:
計算向量叉積是與直線和線段相關演算法的核心部分。設向量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的面積相比較。
判斷乙個點是否在給定的凸四邊形內
方法一 如果乙個點在這個凸四邊形內,那麼按照順時針方向,該點一定在每條邊的右側。可使用向量叉積來看 該方法只適用於凸多邊形。向量叉積 計算向量叉積是與直線和線段相關演算法的核心部分。設向量p x1,y1 q x2,y2 則向量叉積定義為由 0,0 p1 p2和p1 p2所組成的平行四邊形的帶符號的面...
HDU3629 凸四邊形的個數
題目 題意 平面上給n個點,問有多少個凸四邊形?分析 對於每個點,凹四邊形的個數等於 c n 1,3 在這個點同一側三點構成的三角形的個數。對於凸多邊形的乙個頂點,其他頂點必然在穿過這個頂點的直線的同側。算極角時,如果是負數 pi 0 就把它加上2 pi,這樣就把角度統一到了0 2pi,另外,向這題...
Java 判斷乙個點是否在給定矩形內
給出矩形的abcd四個頂點座標,待判斷點k的座標 x,y 原理 連線點a與四個頂點,形成四個三角形。如果四個小三角形面積之和等於矩形面積,即說明該點在矩形內部。三角形面積計算公式 public class solution2 已知座標,求三角形面積 private static double are...