blob: b80e7a054b3eb8aafb389a69300d3411f3df94dc [file] [log] [blame]
//#####################################################################
// Copyright 2002-2004, Robert Bridson, Ronald Fedkiw, Eran Guendelman.
// This file is part of PhysBAM whose distribution is governed by the license contained in the accompanying file PHYSBAM_COPYRIGHT.txt.
//#####################################################################
// Class PLANE
//#####################################################################
#ifndef __PLANE__
#define __PLANE__
#include "../Matrices_And_Vectors/VECTOR_3D.h"
namespace PhysBAM
{
template<class T> class RAY_3D;
template<class T> class BOX_3D;
template<class T>
class PLANE
{
public:
VECTOR_3D<T> normal;
VECTOR_3D<T> x1; // point on the plane
PLANE()
: normal (0, 1, 0), x1 (0, 0, 0)
{}
PLANE (const VECTOR_3D<T>& normal_input, const VECTOR_3D<T>& x1_input)
: normal (normal_input), x1 (x1_input)
{}
PLANE (const VECTOR_3D<T>& x1_input, const VECTOR_3D<T>& x2_input, const VECTOR_3D<T>& x3_input)
{
Specify_Three_Clockwise_Points (x1_input, x2_input, x3_input);
}
void Specify_Three_Clockwise_Points (const VECTOR_3D<T>& x1_input, const VECTOR_3D<T>& x2_input, const VECTOR_3D<T>& x3_input)
{
normal = VECTOR_3D<T>::Cross_Product (x2_input - x1_input, x3_input - x1_input);
normal.Robust_Normalize();
x1 = x1_input;
}
static VECTOR_3D<T> Normal (const VECTOR_3D<T>& x1_input, const VECTOR_3D<T>& x2_input, const VECTOR_3D<T>& x3_input)
{
return VECTOR_3D<T>::Cross_Product (x2_input - x1_input, x3_input - x1_input).Normalized();
}
VECTOR_3D<T> Normal() const
{
return normal;
}
T Shortest_Signed_Distance (const VECTOR_3D<T>& location) const // signed distance from the given location to the plane
{
return VECTOR_3D<T>::Dot_Product (normal, location - x1);
}
virtual ~PLANE()
{}
template<class RW>
void Read (std::istream &input_stream)
{
normal.template Read<RW> (input_stream);
x1.template Read<RW> (input_stream);
}
template<class RW>
void Write (std::ostream &output_stream) const
{
normal.template Write<RW> (output_stream);
x1.template Write<RW> (output_stream);
}
//#####################################################################
bool Intersection (RAY_3D<T>& ray, const T thickness_over_2, const T distance, const T rate_of_approach) const;
bool Intersection (RAY_3D<T>& ray, const T thickness_over_2 = 0) const;
bool Intersection (const BOX_3D<T>& box, const T thickness_over_2 = 0) const;
bool Segment_Plane_Intersection (const VECTOR_3D<T>& endpoint1, const VECTOR_3D<T>& endpoint2, T& interpolation_fraction) const;
bool Lazy_Intersection (RAY_3D<T>& ray) const;
bool Rectangle_Intersection (RAY_3D<T>& ray, const PLANE<T>& bounding_plane_1, const PLANE<T>& bounding_plane_2, const PLANE<T>& bounding_plane_3, const PLANE<T>& bounding_plane_4,
const T thickness_over_2 = 0) const;
bool Inside (const VECTOR_3D<T>& location, const T thickness_over_two = 0) const;
bool Lazy_Inside (const VECTOR_3D<T>& location) const;
bool Outside (const VECTOR_3D<T>& location, const T thickness_over_two = 0) const;
bool Lazy_Outside (const VECTOR_3D<T>& location) const;
bool Boundary (const VECTOR_3D<T>& location, const T thickness_over_two = 0) const;
VECTOR_3D<T> Surface (const VECTOR_3D<T>& location) const;
//#####################################################################
};
}
#endif