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などでも使えるはずなので、当たり判定とかに使えるんじゃないでしょうか。