Boost.Geometry 四角形の内外判定

Boost.Geometryには、2次元上の点を表現するpoint_xyコンセプトと、左上の点と右下の点のペアとして表現されるboxコンセプトがあり、この2つをwithinアルゴリズムに適用することで、四角形の内外判定が簡単にできます。

#include <iostream>
#include <boost/geometry/geometry.hpp>

namespace bg = boost::geometry;

typedef bg::model::d2::point_xy<double> point_type;
typedef bg::model::box<point_type> box_type;

int main()
{
    const point_type    top_left(0, 0);
    const point_type    bottom_right(3, 3);
    const box_type      box(top_left, bottom_right);

    const point_type p(1.5, 1.5);

    if (bg::within(p, box)) {
        std::cout << "in" << std::endl;
    }
    else {
        std::cout << "out" << std::endl;
    }
}
in

MFCなどのライブラリを使用している場合などでも、CPointやCRectをGeometryのコンセプトとしてアダプトすればwithinアルゴリズムが使えます。

#include <afx.h>

#include <iostream>
#include <boost/geometry/geometry.hpp>
#include <boost/geometry/geometries/register/point.hpp>
#include <boost/geometry/geometries/register/box.hpp>

BOOST_GEOMETRY_REGISTER_POINT_2D(CPoint, LONG, cs::cartesian, x, y)
BOOST_GEOMETRY_REGISTER_BOX_2D_4VALUES(CRect, CPoint, left, top, right, bottom)

int main()
{
    const CRect box(0, 0, 3, 3);
    const CPoint p(1, 1);

    if (boost::geometry::within(p, box)) {
        std::cout << "in" << std::endl;
    }
    else {
        std::cout << "out" << std::endl;
    }
}
in

参照:
within
BOOST_GEOMETRY_REGISTER_POINT_2D
BOOST_GEOMETRY_REGISTER_BOX_2D_4VALUES