计算机视觉 / 二维空间中,如何判断点在不在某个封闭图形内?

这是一个 Point in Polygon Test问题。

问题建模

输入: 点变量(用来描述待测试点),点变量数组(用来描述封闭图形),整型变量(用来描述封闭图形的边数)。
输出: bool值(用来描述点是否在封闭图形内)。

测试定理为:
如果从点发出的射线穿过封闭图形边的数量为奇数,则点在图形内,若为偶数,则在图形外。

img

代码

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;
  }
}
posted @ 2021-05-28 16:56  dynmi  阅读(838)  评论(0编辑  收藏  举报