這是一個 Point in Polygon Test問題。
問題建模
輸入: 點變量(用來描述待測試點),點變量數組(用來描述封閉圖形),整型變量(用來描述封閉圖形的邊數)。
輸出: bool值(用來描述點是否在封閉圖形內)。
測試定理爲:
如果從點發出的射線穿過封閉圖形邊的數量爲奇數,則點在圖形內,若爲偶數,則在圖形外。
代碼
bool PointInPolygon(cv:2DPoint pt, vector<cv:2DPoint> polygon)
{
int cnt = 0;
int num = polygon.size();
cv:2DPoint p1;
cv:2DPoint p2;
for (int i = 0; i < num; i++) {
p1 = polygon[i];
p2 = polygon[(i+1)%num];
if (p1.y == p2.y) {
continue;
}
if (pt.y < min(p1.y, p2.y) | pt.y > max(p1.y, p2.y)) {
continue;
}
auto x = (pt.y - p1.y) * (double)(p2.x - p1.x) / (double)(p2.y - p1.y) + p1.x;
if (x > pt.x) {
cnt++;
}
}
if (cnt % 2 == 0) {
return 0;
}else {
return 1;
}
}