最近在處理圖片時遇到一個問題,如何判斷某個點是否落在一個多邊形(比如四邊形)區域里面?
在網上找到一個比較簡潔明了的方法,不過后來運行程序時發現計算量比較大(我是對圖片的每個像素都進行一次判斷),有更好的方法還望指點指點~
這個方法是通過向量的叉乘來判斷的:點如果落在順時針(或逆時針)向量同一邊,則點在多邊形內。如下圖,以順時針為例,分別計算向量 AB與AO、BC與BO、CD與CO、DA與DO的叉乘,所得結果的 z 軸分量同號則說明點 O 在四邊形 ABCD 內部。
附上 Python 實現的代碼:
# 判斷點是否在四邊形內部,在四邊形內部返回1,否則返回0 # x、y為點的坐標,xv為四邊形的x坐標構成的向量,yv為四邊形的y坐標構成的向量 def inpolygon(x, y, xv, yv): z1 = (xv[1] - xv[0]) * (y - yv[0]) - (x - xv[0]) * (yv[1] - yv[0]) z2 = (xv[2] - xv[1]) * (y - yv[1]) - (x - xv[1]) * (yv[2] - yv[1]) z3 = (xv[3] - xv[2]) * (y - yv[2]) - (x - xv[2]) * (yv[3] - yv[2]) z4 = (xv[0] - xv[3]) * (y - yv[3]) - (x - xv[3]) * (yv[0] - yv[3]) if(z1 * z2 > 0 and z3 * z4 > 0 and z1 * z3 > 0): # z1, z2, z3, z4同號 return 1 return 0