計算機視覺 / 二維空間中,如何判斷點在不在某個封閉圖形內?

這是一個 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;
  }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章