这是一个 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;
}
}