region: add make_union function

This commit is contained in:
Danny Robson 2017-07-31 15:42:05 +10:00
parent 0016c83dab
commit 01f6e5a1e8
2 changed files with 35 additions and 0 deletions

View File

@ -111,6 +111,19 @@ namespace util {
void sanity (void) const;
};
///////////////////////////////////////////////////////////////////////////
/// constructs the minimal region that encompasses a region and a point.
template <typename T, size_t S>
region<S,T>
make_union (region<S,T> r, point<S,T> p)
{
const auto p0 = select (r.p < p, r.p, p);
const auto p1 = select (r.away () > p, r.away (), p);
return { p0, p1 };
}
template <typename T> using region2 = region<2,T>;
template <typename T> using region3 = region<3,T>;

View File

@ -63,6 +63,28 @@ main (int, char **)
tap.expect (!r.has (util::point2u {2, 2}), "unsigned region corner has");
}
// ensure make_union behaves as expected
{
const util::point2f p { -1 };
const util::extent2f e { 2 };
const util::region2f r { p, e };
tap.expect_eq (util::make_union (r, util::point2f { 0, 0 }), r, "identity union");
tap.expect_eq (
util::make_union (r, util::point2f { 2, 3 }),
util::region2f { p, util::extent2f { 3, 4 } },
"positive expanding union"
);
tap.expect_eq (
util::make_union (r, util::point2f { -3, -2 }),
util::region2f {
util::point2f { -3, -2 },
util::extent2f { 4, 3 }
},
"negative expanding union"
);
};
//CHECK (region<2,intmax_t> (0, 0, 10, 10).includes (point2d (0.4, 0.01)));
//CHECK (region<2,intmax_t> (0, 0, 10, 10).contains (point2d (0.4, 0.01)));