www.pudn.com > coolMEMORY.rar > AS_Plane.h
//-----------------------------------------------------------------------------
// File: AS_Plane.h
//-----------------------------------------------------------------------------
#ifndef __AS_PLANE_H__
#define __AS_PLANE_H__
// Classes: *******************************************************************
typedef class AS_PLANE
{
public:
AS_3D_VECTOR vN;
float fD;
AS_PLANE(float fA = 1.0f, float fB = 0.0f, float fC = 0.0f, float fD1 = 0.0f)
{
vN = AS_3D_VECTOR(fA, fB, fC).Normalize();
fD = fD1;
}
AS_PLANE(AS_3D_VECTOR &vVertexA, AS_3D_VECTOR &vVertexB, AS_3D_VECTOR &vVertexC)
{
AS_3D_VECTOR vNormalA = ((vVertexC-vVertexA).Normalize());
AS_3D_VECTOR vNormalB = ((vVertexC-vVertexB).Normalize());
vN = (vNormalA.CrossProduct(vNormalB)).Normalize();
fD = -vVertexA.DotProduct(vN);
}
AS_PLANE &operator = (AS_PLANE &Plane)
{
vN = Plane.vN;
fD = Plane.fD;
return *this;
}
// Boolean Operators:
BOOL operator == (AS_PLANE &Plane)
{
return vN == Plane.vN && fD == Plane.fD;
}
BOOL operator != (AS_PLANE &Plane)
{
return !(*this == Plane);
}
BOOL PointOnPlane(AS_3D_VECTOR &vPoint)
{
return DistanceToPlane(vPoint) == 0;
}
float DistanceToPlane(AS_3D_VECTOR &vPoint)
{
return ((vN.DotProduct(vPoint))+fD);
}
AS_3D_VECTOR RayIntersection(AS_3D_VECTOR &vRayPos, AS_3D_VECTOR &vRayDir)
{
float fA = vN.DotProduct(vRayDir);
if(!fA)
return vRayPos; // Error line parallel to plane
return vRayPos-vRayDir*(DistanceToPlane(vRayPos)/fA);
}
} AS_PLANE;
///////////////////////////////////////////////////////////////////////////////
#endif // __AS_PLANE_H__