点是否在多边形内

求解通过该点的水平线与多边形各边的交点,单边交点为奇数,则成立

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 }
原文地址:https://www.cnblogs.com/SamRichard/p/6909472.html