How can I determine whether a 2D Point is within a Polygon?

前端 未结 30 2161
醉梦人生
醉梦人生 2020-11-21 05:06

I\'m trying to create a fast 2D point inside polygon algorithm, for use in hit-testing (e.g. Polygon.contains(p:Point)). Suggestions for effective tech

30条回答
  •  爱一瞬间的悲伤
    2020-11-21 06:01

    This is a presumably slightly less optimized version of the C code from here which was sourced from this page.

    My C++ version uses a std::vector> and two doubles as an x and y. The logic should be exactly the same as the original C code, but I find mine easier to read. I can't speak for the performance.

    bool point_in_poly(std::vector>& verts, double point_x, double point_y)
    {
        bool in_poly = false;
        auto num_verts = verts.size();
        for (int i = 0, j = num_verts - 1; i < num_verts; j = i++) {
            double x1 = verts[i].first;
            double y1 = verts[i].second;
            double x2 = verts[j].first;
            double y2 = verts[j].second;
    
            if (((y1 > point_y) != (y2 > point_y)) &&
                (point_x < (x2 - x1) * (point_y - y1) / (y2 - y1) + x1))
                in_poly = !in_poly;
        }
        return in_poly;
    }
    

    The original C code is

    int pnpoly(int nvert, float *vertx, float *verty, float testx, float testy)
    {
      int i, j, c = 0;
      for (i = 0, j = nvert-1; i < nvert; j = i++) {
        if ( ((verty[i]>testy) != (verty[j]>testy)) &&
         (testx < (vertx[j]-vertx[i]) * (testy-verty[i]) / (verty[j]-verty[i]) + vertx[i]) )
           c = !c;
      }
      return c;
    }
    

提交回复
热议问题