“角度和法”的思路是:多邊形內的點,與所有頂點順次連接形成向量的夾角之和爲2π。
圖例說明,如下圖所示:
O點在多邊形之內,其與多邊形所有頂點的連線,組成6個向量,順次形成6個向量夾角,顯而易見,這6個夾角之和爲2π。
P點在多邊形之外,其與多邊形所有頂點的連線,組成6個向量,順次形成6個向量夾角,顯而易見,這6個夾角之和不等於2π。確切的說是小於2π。
計算夾角的方法可按如下公式實現:
公式中,a和b就是組成夾角的兩個向量,在反餘弦函數括號中,分子部分爲兩個向量的點乘,分子部分爲兩個向量各自的2範數相乘。在這裏要說明一下,如果要判斷的點就是多邊形頂點之一,則a和b其中之一的2範數爲0,需要特別處理;如果點在多邊形的邊上,則有存在一個夾角爲π的情況。這兩種情況均可以認爲該點在多邊形的邊上。
此方法和之前談到的向量積法、面積法一樣,可以直接適用於凸多邊形,至於凹多邊形,也可以用,不過要將凹的部分可能重複計算夾角的地方調整座標在集合中的順序後計算夾角。另外一個問題和麪積法相似,就是計算角度存在一定的舍入誤差,影響計算的精度。
參考代碼:
int InPolygon_Angle(const CZPolygon& polygon, CZPoint_t pt){
int itNumPt = polygon.size();
CZPoint_t pt_1, pt_2;
double duAngleAll = 0.0;
for (int i = 0; i < (itNumPt - 1); i++) {
pt_1 = polygon[i];
pt_2 = polygon[i + 1];
double duA = Angle(&pt, &pt_1, &pt_2);
if ((NOANGLE == duA) || (ABS(duA - PI) < EPS))
return ONSIDE;
duAngleAll += duA;
}
return ABS(duAngleAll - 2*PI)<EPS ? INSIDE : OUTSIDE;
}
效果和博客http://blog.csdn.net/ezhchai/article/details/78864336一樣,這裏就不再重複貼了。