読者です 読者をやめる 読者になる 読者になる

Boost.Geometry disjoint

C++

boost::geometry::disjoint()アルゴリズムは、2つのジオメトリが互いに素かどうかを判定する関数です。
ジオメトリ同士が重なっていなければtrue、重なっていたらfalseを返します。

namespace boost { namespace geometry {

template<typename Geometry1, typename Geometry2>
bool disjoint(Geometry1 const & geometry1, Geometry2 const & geometry2)

}}

たとえば、以下は2つのboxが重なっていないか判定する処理です:

#include <boost/assert.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
#include <boost/geometry/geometries/box.hpp>
#include <boost/geometry/algorithms/disjoint.hpp>

namespace bg = boost::geometry;

typedef bg::model::d2::point_xy<double> point;
typedef bg::model::box<point> box;

int main()
{
    // disjoint
    // a
    // +------+
    // |      |
    // |      |
    // +------+  b
    //           +------+
    //           |      |
    //           |      |
    //           +------+
    {
        const box a(point(0, 0), point(3, 3));
        const box b(point(4, 4), point(7, 7));

        const bool result = bg::disjoint(a, b);
        BOOST_ASSERT(result);
    }

    // not disjoint
    // a
    // +------+
    // |   b  |
    // |   +--+---+
    // +---+--+   |
    //     |      |
    //     +------+
    {
        const box a(point(0, 0), point(3, 3));
        const box b(point(2, 2), point(5, 5));

        const bool result = bg::disjoint(a, b);
        BOOST_ASSERT(!result);
    }
}

2つのboxが重なっていなければdisjoint()はtrueを返し、
重なっていればfalseを返します。


disjoint()はbox同士だけではなく、Geometryコンセプトを満たしているpointやpolygonなどとも比較できます。以下は、boxとpoint_xyが互いに素か判定しています。

#include <boost/assert.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
#include <boost/geometry/geometries/box.hpp>
#include <boost/geometry/algorithms/disjoint.hpp>

namespace bg = boost::geometry;

typedef bg::model::d2::point_xy<double> point;
typedef bg::model::box<point> box;

int main()
{
    // disjoint
    // a
    // +------+
    // |      |
    // |      |
    // +------+
    //           b
    {
        const box a(point(0, 0), point(3, 3));
        const point b(4, 4);

        const bool result = bg::disjoint(a, b);
        BOOST_ASSERT(result);
    }
    // not disjoint
    // a
    // +------+
    // |  b   |
    // |      |
    // +------+
    {
        const box a(point(0, 0), point(3, 3));
        const point b(2, 2);

        const bool result = bg::disjoint(a, b);
        BOOST_ASSERT(!result);
    }
}

ちなみにコメントで書いてる図の座標はイメージです。
lineやringなどでも使えるはずなので、当たり判定とかに使えるんじゃないでしょうか。


参照:
disjoint algorithm