region: add intersection operation
This commit is contained in:
parent
7550ad7c23
commit
8697c103d6
18
region.hpp
18
region.hpp
@ -226,6 +226,24 @@ namespace cruft {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
/// Construct a region that consists of the overlapping portions of two
|
||||||
|
/// supplied regions.
|
||||||
|
///
|
||||||
|
/// The behaviour is undefined if there is no overlap. The caller should
|
||||||
|
/// test using `intersects` if required beforehand.
|
||||||
|
template <typename T, std::size_t S>
|
||||||
|
region<S,T>
|
||||||
|
intersection (region<S,T> const a, region<S,T> const b)
|
||||||
|
{
|
||||||
|
// Find the two corners of the new region.
|
||||||
|
auto const lo = cruft::max (a.base (), b.base ());
|
||||||
|
auto const hi = cruft::min (a.away (), b.away ());
|
||||||
|
CHECK (all (lo <= hi));
|
||||||
|
|
||||||
|
return { lo, hi };
|
||||||
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
/// 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>
|
||||||
|
@ -136,5 +136,52 @@ main (int, char **)
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// Test expected results of 2 region interesection
|
||||||
|
{
|
||||||
|
using p_t = cruft::point2i;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
cruft::region2i a;
|
||||||
|
cruft::region2i b;
|
||||||
|
cruft::region2i res;
|
||||||
|
char const *msg;
|
||||||
|
} const TESTS[] = {
|
||||||
|
{
|
||||||
|
.a = { p_t { 0, 0 }, p_t { 1, 1 } },
|
||||||
|
.b = { p_t { 0, 0 }, p_t { 1, 1 } },
|
||||||
|
.res = { p_t { 0, 0 }, p_t { 1, 1 } },
|
||||||
|
.msg = "identical, unit sizes",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.a = { p_t { 0, 0 }, p_t { 1, 1 } },
|
||||||
|
.b = { p_t { 1, 1 }, p_t { 2, 2 } },
|
||||||
|
.res = { p_t { 1, 1 }, p_t { 1, 1 } },
|
||||||
|
.msg = "unit sized, shared corner",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.a = { p_t { -4, -5 }, p_t { 5, 3 } },
|
||||||
|
.b = { p_t { -1, -2 }, p_t { 2, 1 } },
|
||||||
|
.res = { p_t { -1, -2 }, p_t { 2, 1 } },
|
||||||
|
.msg = "a contains b",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.a = { p_t { -1, -2 }, p_t { 2, 1 } },
|
||||||
|
.b = { p_t { -4, -5 }, p_t { 5, 3 } },
|
||||||
|
.res = { p_t { -1, -2 }, p_t { 2, 1 } },
|
||||||
|
.msg = "b contains a",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.a = { p_t { -3, -1 }, p_t { 4, 8 } },
|
||||||
|
.b = { p_t { -1, -4 }, p_t { 6, 2 } },
|
||||||
|
.res = { p_t { -1, -1 }, p_t { 4, 2 } },
|
||||||
|
.msg = "partial overlap",
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
for (auto const &[a, b, res, message]: TESTS)
|
||||||
|
tap.expect_eq (intersection (a, b), res, "region-region interesection: %!", message);
|
||||||
|
}
|
||||||
|
|
||||||
return tap.status ();
|
return tap.status ();
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user