zoukankan      html  css  js  c++  java
  • 点是否在多边形内

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

    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 }
  • 相关阅读:
    IntentService源码分析
    startService过程源码分析
    洛谷P3300 城市规划
    agc033
    洛谷P3306 随机数生成器
    洛谷P3299 保护出题人
    洛谷P3298 泉
    洛谷P3296 刺客信条
    树hash
    我们都爱膜您退火!
  • 原文地址:https://www.cnblogs.com/SamRichard/p/6909472.html
Copyright © 2011-2022 走看看