00001 #include "plane.h"
00002 #include "ray3.h"
00003
00004 namespace argos {
00005
00006
00007
00008
00009 bool CPlane::Intersects(Real& f_t_on_ray,
00010 const CRay3& c_ray) {
00011
00012 CVector3 cRayDir;
00013 c_ray.GetDirection(cRayDir);
00014
00015 Real fNumerator = (m_cPosition-c_ray.GetStart()).DotProduct(m_cNormal);
00016 Real fDenominator = cRayDir.DotProduct(m_cNormal);
00017
00018 if(Abs(fDenominator) > 1e-6) {
00019
00020 f_t_on_ray = fNumerator / fDenominator / c_ray.GetLength();
00021 return (f_t_on_ray < 1.0f);
00022 }
00023 else {
00024
00025
00026 if(Abs(fNumerator) > 1e-6) {
00027
00028
00029 return false;
00030 }
00031 else {
00032
00033 f_t_on_ray = 0.0f;
00034 return true;
00035 }
00036 }
00037 }
00038
00039
00040
00041
00042 }