点是否在多边形内
求解通过该点的水平线与多边形各边的交点,单边交点为奇数,则成立
ok我们其实就是需要看这个点的单边射线与多边形的交点,代码实现如下:
1 bool isInPolygon(cv::Point pt, std::vector<cv::Point> points) 2 { 3 int nCross = 0; 4 int n = points.size(); 5 for (int i = 0; i < n; i++) { 6 cv::Point& p1 = points[i]; 7 cv::Point& p2 = points[(i + 1) % n]; 8 // 求解 y=p.y 与 p1 p2 的交点 9 // p1p2 与 y=p0.y平行 10 if (p1.y == p2.y) 11 continue; 12 // 交点在p1p2延长线上 13 if (pt.y < min(p1.y, p2.y)) 14 continue; 15 // 交点在p1p2延长线上 16 if (pt.y >= max(p1.y, p2.y)) 17 continue; 18 // 求交点的 X 坐标 19 double x = (double)(pt.y - p1.y) * (double)(p2.x - p1.x) 20 / (double)(p2.y - p1.y) + p1.x; 21 // 只统计单边交点 22 if (x > pt.x) 23 nCross++; 24 } 25 return (nCross % 2 == 1); 26 }
posted on 2017-05-26 17:03 Sam.Richard 阅读(180) 评论(0) 编辑 收藏 举报