region: add union operator for region/region

This commit is contained in:
Danny Robson 2018-06-14 15:07:25 +10:00
parent e9d5909f21
commit 3722c8aaa3
2 changed files with 24 additions and 5 deletions

View File

@ -201,7 +201,7 @@ namespace util {
/// constructs the minimal region that encompasses a region and a point. /// constructs the minimal region that encompasses a region and a point.
template <typename T, size_t S> template <typename T, size_t S>
region<S,T> region<S,T>
make_union (region<S,T> r, point<S,T> p) operator| (region<S,T> const r, point<S,T> const p)
{ {
const auto p0 = select (r.p < p, r.p, p); const auto p0 = select (r.p < p, r.p, p);
const auto p1 = select (r.away () > p, r.away (), p); const auto p1 = select (r.away () > p, r.away (), p);
@ -209,6 +209,25 @@ namespace util {
} }
//-------------------------------------------------------------------------
template <typename T, size_t S>
auto
operator| (point<S,T> const p, region<S,T> const r)
{
return r | p;
}
//-------------------------------------------------------------------------
// construct a minimal bounding region over two supplied regions
template <typename T, size_t S>
region<S,T>
operator| (region<S,T> const a, region<S,T> const b)
{
return a | b.base () | b.away ();
}
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
/// returns the squared minimum distance from a region to a given point /// returns the squared minimum distance from a region to a given point
template <size_t S, typename T> template <size_t S, typename T>

View File

@ -59,20 +59,20 @@ main (int, char **)
tap.expect (r.inclusive (util::point2f {2, 2}), "region/point inclusive, corner"); tap.expect (r.inclusive (util::point2f {2, 2}), "region/point inclusive, corner");
} }
// ensure make_union behaves as expected // ensure union operator behaves as expected
{ {
const util::point2f p { -1 }; const util::point2f p { -1 };
const util::extent2f e { 2 }; const util::extent2f e { 2 };
const util::region2f r { p, e }; const util::region2f r { p, e };
tap.expect_eq (util::make_union (r, util::point2f { 0, 0 }), r, "identity union"); tap.expect_eq (r | util::point2f { 0, 0 }, r, "identity union");
tap.expect_eq ( tap.expect_eq (
util::make_union (r, util::point2f { 2, 3 }), r | util::point2f { 2, 3 },
util::region2f { p, util::extent2f { 3, 4 } }, util::region2f { p, util::extent2f { 3, 4 } },
"positive expanding union" "positive expanding union"
); );
tap.expect_eq ( tap.expect_eq (
util::make_union (r, util::point2f { -3, -2 }), r | util::point2f { -3, -2 },
util::region2f { util::region2f {
util::point2f { -3, -2 }, util::point2f { -3, -2 },
util::extent2f { 4, 3 } util::extent2f { 4, 3 }