From 5b878983a65d70daae586a0637d68a72fbe6b2bd Mon Sep 17 00:00:00 2001 From: Danny Robson Date: Wed, 8 Apr 2015 19:00:17 +1000 Subject: [PATCH] aabb: add contract and closest methods --- aabb.cpp | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ aabb.hpp | 7 +++++++ 2 files changed, 64 insertions(+) diff --git a/aabb.cpp b/aabb.cpp index d3f24d3b..7da23dc3 100644 --- a/aabb.cpp +++ b/aabb.cpp @@ -58,6 +58,63 @@ AABB::overlaps (point p) const } +//----------------------------------------------------------------------------- +template +util::point +AABB::closest (point q) const +{ + point res; + + for (size_t i = 0; i < S; ++i) + res[i] = q[i] < p0[i] ? p0[i] : + q[i] > p1[i] ? p1[i] : + q[i]; + + return res; +} + + +//----------------------------------------------------------------------------- +template +AABB& +AABB::contract (util::vector mag) +{ + p0 -= mag / T{2}; + p1 += mag / T{2}; + + return *this; +} + + +//----------------------------------------------------------------------------- +template +AABB& +AABB::contract (T mag) +{ + return contract (util::vector {mag}); +} + + +//----------------------------------------------------------------------------- +template +AABB +AABB::contracted (util::vector mag) const +{ + AABB res = *this; + res.contract (mag); + return res; +} + + +//----------------------------------------------------------------------------- +template +AABB +AABB::contracted (T mag) const +{ + return contracted (vector {mag}); +} + + //----------------------------------------------------------------------------- template void diff --git a/aabb.hpp b/aabb.hpp index 3a3d56b3..9f27d0ec 100644 --- a/aabb.hpp +++ b/aabb.hpp @@ -37,6 +37,13 @@ namespace util { bool overlaps (point) const; + point closest (point) const; + + AABB& contract (util::vector); + AABB& contract (T); + AABB contracted (util::vector) const; + AABB contracted (T) const; + void cover (point); AABB operator+ (vector) const;