6

I have a big list of points that define a boundary of some (not necessarily convex) shape. I then have some query point (x, y) and I want to determine whether (x, y) is within the region defined by my boundary of points.

So, simple enough question. How do I determine whether the query point would be inside the shape formed by my boundary points? And is there a nice boost module for this? I am looking through boost::geometry but haven't found anything yet..

zebra
  • 5,743
  • 17
  • 53
  • 64
  • 2
    obligatory Wikipedia link: [Point In Polygon](http://en.wikipedia.org/wiki/Point_in_polygon) – Kevin May 17 '12 at 16:22
  • 3
    For Boost.Geometry specifically, you want [`within`](http://www.boost.org/libs/geometry/doc/html/geometry/reference/algorithms/within/within_2.html) or [`covered_by`](http://www.boost.org/libs/geometry/doc/html/geometry/reference/algorithms/covered_by/covered_by_2.html). – ildjarn May 17 '12 at 16:24

1 Answers1

7

Seems you are looking for within, no?

http://www.boost.org/libs/geometry/doc/html/geometry/reference/algorithms/within/within_2.html

The example they give on the page is, in fact, point-in-polygon:

#include <iostream>
#include <list>

#include <boost/geometry.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
#include <boost/geometry/geometries/polygon.hpp>

#include <boost/geometry/domains/gis/io/wkt/wkt.hpp>


int main()
{
    typedef boost::geometry::model::d2::point_xy<double> point_type;
    typedef boost::geometry::model::polygon<point_type> polygon_type;

    polygon_type poly;
    boost::geometry::read_wkt(
        "POLYGON((2 1.3,2.4 1.7,2.8 1.8,3.4 1.2,3.7 1.6,3.4 2,4.1 3,5.3 2.6,5.4 1.2,4.9 0.8,2.9 0.7,2 1.3)"
            "(4.0 2.0, 4.2 1.4, 4.8 1.9, 4.4 2.2, 4.0 2.0))", poly);

    point_type p(4, 1);

    std::cout << "within: " << (boost::geometry::within(p, poly) ? "yes" : "no") << std::endl;

    return 0;
}

UPDATE: as @ildjarn points out, you might rather use covered_by if you wanted points that lie on the polygon edge itself to count:

http://www.boost.org/libs/geometry/doc/html/geometry/reference/algorithms/covered_by/covered_by_2.html

The behavior of within w.r.t. edges "depends", so take note of that nuance in the documentation.