ugluk
01-25-2010, 06:23 AM
I am currently using this function to subdivide an AABB in an octree. I am dissatisfied with it, as it uses 3 loops and std::pow(), maybe there's some trick to simplify this? Please show me some C++ power. The AABBs are all center-radius AABBs.
template <class U1, class U2>
void subdivide_aabb(AABB<U1, U2> const& aabb,
std::vector<AABB<U1, U2> >& aabbs)
{
BOOST_ASSERT(aabbs.empty());
AABB<U1, U2> naabb;
naabb.b = 0.5 * aabb.b;
for (unsigned char i(0); i != 2; ++i)
{
for (unsigned char j(0); j != 2; ++j)
{
for (unsigned char k(0); k != 2; ++k)
{
naabb.a = aabb.a;
naabb.a += U1(std::pow(-1, i) * naabb.b(0),
std::pow(-1, j) * naabb.b(1),
std::pow(-1, k) * naabb.b(2));
aabbs.push_back(naabb);
}
}
}
BOOST_ASSERT(8 == aabbs.size());
}
template <class U1, class U2>
void subdivide_aabb(AABB<U1, U2> const& aabb,
std::vector<AABB<U1, U2> >& aabbs)
{
BOOST_ASSERT(aabbs.empty());
AABB<U1, U2> naabb;
naabb.b = 0.5 * aabb.b;
for (unsigned char i(0); i != 2; ++i)
{
for (unsigned char j(0); j != 2; ++j)
{
for (unsigned char k(0); k != 2; ++k)
{
naabb.a = aabb.a;
naabb.a += U1(std::pow(-1, i) * naabb.b(0),
std::pow(-1, j) * naabb.b(1),
std::pow(-1, k) * naabb.b(2));
aabbs.push_back(naabb);
}
}
}
BOOST_ASSERT(8 == aabbs.size());
}