#ifndef PASTELGEOMETRY_OVERLAPS_ALIGNEDPLANE_TRIANGLE_HPP
#define PASTELGEOMETRY_OVERLAPS_ALIGNEDPLANE_TRIANGLE_HPP
#include "pastel/geometry/overlap/overlaps_alignedplane_triangle.h"
#include "pastel/geometry/shape/alignedplane.h"
#include "pastel/geometry/shape/triangle.h"
namespace Pastel
{
template <typename Real, integer N>
bool overlaps(
const AlignedPlane<Real, N>& plane,
const PASTEL_TRIANGLE(Real, N)& triangle)
{
// There is an intersection if two points of the triangle
// are located at different sides of AlignedPlane or any of
// the points are on the plane.
// EPSILON
if (plane.position() - triangle[0][plane.axis()] == 0)
{
// There is a point on the plane.
return true;
}
// EPSILON
if (plane.position() - triangle[1][plane.axis()] == 0)
{
// There is a point on the plane.
return true;
}
// EPSILON
if (plane.position() - triangle[2][plane.axis()] == 0)
{
// There is a point on the plane.
return true;
}
bool aSide = (plane.position() > triangle[0][plane.axis()]);
bool bSide = (plane.position() > triangle[1][plane.axis()]);
bool cSide = (plane.position() > triangle[2][plane.axis()]);
return ((aSide != bSide) || (aSide != cSide));
}
template <typename Real, integer N>
bool overlaps(
const AlignedPlane<Real, N>& plane,
const PASTEL_TRIANGLE(Real, N)& triangle,
bool &triangleOnPositiveSide)
{
// There is an intersection if two points of the triangle
// are located at different sides of AlignedPlane or any of
// the points are on the plane.
// EPSILON
if (plane.position() - triangle[0][plane.axis()] == 0)
{
// There is a point on the plane.
return true;
}
// EPSILON
if (plane.position() - triangle[1][plane.axis()] == 0)
{
// There is a point on the plane.
return true;
}
// EPSILON
if (plane.position() - triangle[2][plane.axis()] == 0)
{
// There is a point on the plane.
return true;
}
bool aSide = (plane.position() > triangle[0][plane.axis()]);
bool bSide = (plane.position() > triangle[1][plane.axis()]);
bool cSide = (plane.position() > triangle[2][plane.axis()]);
triangleOnPositiveSide = aSide;
return ((aSide != bSide) || (aSide != cSide));
}
}
#endif