//#####################################################################
// Copyright 2009, Jon Gretarsson.
// This file is part of PhysBAM whose distribution is governed by the license contained in the accompanying file PHYSBAM_COPYRIGHT.txt.
//#####################################################################
// Namespace INTERSECTION
//##################################################################### 
#include <Core/Intersections/BOX_PLANE_INTERSECTION.h>
#include <Core/Basic_Geometry/PLANE.h>
#include <Core/Math_Tools/cube.h>
#include <Core/Math_Tools/RANGE.h>
namespace PhysBAM{
//#####################################################################
// Function Intersects
//#####################################################################
template<class T> bool Intersects(const RANGE<VECTOR<T,3> >& box,const PLANE<T>& plane,const T thickness_over_two)
{
    typedef VECTOR<T,3> TV;
    bool points_on_positive_side=false,points_on_negative_side=false;
    for(int i=0;i<2;i++) for(int j=0;j<2;j++) for(int k=0;k<2;k++){
        TV test_point(i?box.min_corner.x:box.max_corner.x,j?box.min_corner.y:box.max_corner.y,k?box.min_corner.z:box.max_corner.z);
        T distance=plane.normal.Dot(test_point-plane.x0);
        if(distance>-thickness_over_two)points_on_positive_side=true;
        if(distance<thickness_over_two)points_on_negative_side=true;}
    return points_on_positive_side && points_on_negative_side;
}
//#####################################################################
template bool Intersects(const RANGE<VECTOR<float,3> >&,const PLANE<float>&,const float);
template bool Intersects(const RANGE<VECTOR<double,3> >&,const PLANE<double>&,const double);
}
