#ifndef PASTELGEOMETRY_BOX_AREA_HPP
#define PASTELGEOMETRY_BOX_AREA_HPP
#include "pastel/geometry/area/box_area.h"
#include "pastel/sys/vector/vector_tools.h"
namespace Pastel
{
template <typename Real, integer N>
Real area(const AlignedBox<Real, N>& box)
{
return boxArea(box.max() - box.min());
}
template <typename Real, integer N>
Real area(const Box<Real, N>& box)
{
return boxArea(2 * box.width());
}
template <typename Real, typename Expression>
Real boxArea(const VectorExpression<Real, 1, Expression>& width)
{
return 0;
}
template <typename Real, integer N, typename Expression>
Real boxArea(const VectorExpression<Real, N, Expression>& width)
{
// area = 2 * sum_i(width[0] * ... * width[i - 1] * width[i + 1] * ... * width[N])
//
// Note that even if the box has volume 0, it can still
// have area (if exactly one of width[i] is zero).
integer dimension = width.size();
Real result = 0;
for (integer i = 0;i < dimension;++i)
{
Real faceArea = 1;
for (integer k = 0;k < i;++k)
{
faceArea *= width[k];
}
for (integer k = i + 1;k < dimension;++k)
{
faceArea *= width[k];
}
result += faceArea;
}
return 2 * result;
}
}
#endif