aabb: add expand call
This commit is contained in:
parent
c94535dfae
commit
afad51db9d
@ -244,6 +244,7 @@ AM_LDFLAGS += $(BOOST_LDFLAGS) $(BOOST_FILESYSTEM_LIB) $(BOOST_SYSTEM_LIB)
|
|||||||
AM_CXXFLAGS += -I$(top_srcdir)
|
AM_CXXFLAGS += -I$(top_srcdir)
|
||||||
|
|
||||||
TEST_BIN = \
|
TEST_BIN = \
|
||||||
|
test/aabb \
|
||||||
test/backtrace \
|
test/backtrace \
|
||||||
test/bezier \
|
test/bezier \
|
||||||
test/bitwise \
|
test/bitwise \
|
||||||
|
49
aabb.cpp
49
aabb.cpp
@ -74,13 +74,58 @@ AABB<S,T>::closest (point<S,T> q) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
template <size_t S, typename T>
|
||||||
|
AABB<S,T>&
|
||||||
|
AABB<S,T>::expand (util::vector<S,T> mag)
|
||||||
|
{
|
||||||
|
p0 -= mag / T{2};
|
||||||
|
p1 += mag / T{2};
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
template <size_t S, typename T>
|
template <size_t S, typename T>
|
||||||
AABB<S,T>&
|
AABB<S,T>&
|
||||||
|
AABB<S,T>::expand (T t)
|
||||||
|
{
|
||||||
|
return expand (vector<S,T> {t});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
template <size_t S, typename T>
|
||||||
|
AABB<S,T>
|
||||||
|
AABB<S,T>::expanded (vector<S,T> mag)
|
||||||
|
{
|
||||||
|
auto ret = *this;
|
||||||
|
ret.expand (mag);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
template <size_t S, typename T>
|
||||||
|
AABB<S,T>
|
||||||
|
AABB<S,T>::expanded (T t)
|
||||||
|
{
|
||||||
|
return expanded (vector<S,T> {t});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
template <size_t S, typename T>
|
||||||
|
AABB<S,T>&
|
||||||
AABB<S,T>::contract (util::vector<S,T> mag)
|
AABB<S,T>::contract (util::vector<S,T> mag)
|
||||||
{
|
{
|
||||||
p0 -= mag / T{2};
|
// Avoid contracting magnitudes larger than our extent
|
||||||
p1 += mag / T{2};
|
auto diff = p1 - p0;
|
||||||
|
auto delta = min (diff, mag);
|
||||||
|
|
||||||
|
p0 += delta / T{2};
|
||||||
|
p1 -= delta / T{2};
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
5
aabb.hpp
5
aabb.hpp
@ -39,6 +39,11 @@ namespace util {
|
|||||||
|
|
||||||
point<S,T> closest (point<S,T>) const;
|
point<S,T> closest (point<S,T>) const;
|
||||||
|
|
||||||
|
AABB<S,T>& expand (util::vector<S,T>);
|
||||||
|
AABB<S,T>& expand (T);
|
||||||
|
AABB<S,T> expanded (util::vector<S,T>);
|
||||||
|
AABB<S,T> expanded (T);
|
||||||
|
|
||||||
AABB<S,T>& contract (util::vector<S,T>);
|
AABB<S,T>& contract (util::vector<S,T>);
|
||||||
AABB<S,T>& contract (T);
|
AABB<S,T>& contract (T);
|
||||||
AABB<S,T> contracted (util::vector<S,T>) const;
|
AABB<S,T> contracted (util::vector<S,T>) const;
|
||||||
|
51
test/aabb.cpp
Normal file
51
test/aabb.cpp
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
#include "aabb.hpp"
|
||||||
|
|
||||||
|
int
|
||||||
|
main (int, char**)
|
||||||
|
{
|
||||||
|
{
|
||||||
|
// Test contraction
|
||||||
|
util::AABB2f box {
|
||||||
|
{ 2, 2 },
|
||||||
|
{ 8, 8 }
|
||||||
|
};
|
||||||
|
|
||||||
|
box.contract (2.f);
|
||||||
|
|
||||||
|
CHECK_EQ (box.p0.x, 3);
|
||||||
|
CHECK_EQ (box.p0.y, 3);
|
||||||
|
CHECK_EQ (box.p1.x, 7);
|
||||||
|
CHECK_EQ (box.p1.y, 7);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
// Test expansion
|
||||||
|
util::AABB2f box {
|
||||||
|
{ 2, 2 },
|
||||||
|
{ 8, 8 }
|
||||||
|
};
|
||||||
|
|
||||||
|
box.expand (2.f);
|
||||||
|
|
||||||
|
CHECK_EQ (box.p0.x, 1);
|
||||||
|
CHECK_EQ (box.p0.y, 1);
|
||||||
|
CHECK_EQ (box.p1.x, 9);
|
||||||
|
CHECK_EQ (box.p1.y, 9);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
// Ensure we don't wrap-around on unsigned position types when contracting
|
||||||
|
util::AABB2f small {
|
||||||
|
{ 0, 0 },
|
||||||
|
{ 1, 1 }
|
||||||
|
};
|
||||||
|
|
||||||
|
small.contract (10);
|
||||||
|
|
||||||
|
CHECK_EQ (small.p0.x, 0.5f);
|
||||||
|
CHECK_EQ (small.p0.y, 0.5f);
|
||||||
|
CHECK_EQ (small.p1.x, 0.5f);
|
||||||
|
CHECK_EQ (small.p1.y, 0.5f);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user