xsi_plane.h
Go to the documentation of this file.

    00001 //*****************************************************************************
    00011 //*****************************************************************************
    00012
    00013 #if (_MSC_VER > 1000) || defined(SGI_COMPILER)
    00014 #pragma once
    00015 #endif
    00016
    00017 #ifndef __XSIPLANE_H__
    00018 #define __XSIPLANE_H__
    00019
    00020 #include "sicppsdk.h"
    00021 #include "xsi_status.h"
    00022 #include "xsi_vector3.h"
    00023 #include "xsi_line.h"
    00024 #include <math.h>
    00025
    00026 namespace XSI {
    00027
    00028 namespace MATH {
    00029
    00030 //*****************************************************************************
    00040 //*****************************************************************************
    00041 class SICPPSDKDECL CPlane
    00042 {
    00043 public:
    00045     SICPPSDK_INLINE CPlane();
    00046
    00051     SICPPSDK_INLINE CPlane( const CVector3 &in_point, const CVector3 &in_normal );
    00052
    00058     SICPPSDK_INLINE CPlane( const CVector3 &in_point, const CVector3 &in_tangentU, const CVector3 &in_tangentV );
    00059
    00063     SICPPSDK_INLINE CPlane( const CPlane &in_plane );
    00064
    00066     SICPPSDK_INLINE ~CPlane();
    00067
    00072     SICPPSDK_INLINE CPlane & operator=( const CPlane & in_plane );
    00073
    00079     SICPPSDK_INLINE bool operator ==(const CPlane &in_plane )const;
    00080
    00086     SICPPSDK_INLINE bool operator !=(const CPlane &in_plane )const;
    00087
    00094     SICPPSDK_INLINE bool EpsilonEquals(const CPlane &in_plane, double in_dEpsilon)const;
    00095
    00100     SICPPSDK_INLINE bool Equals(const CPlane &in_plane)const;
    00101
    00106     bool Parallel(const CPlane &in_plane)const;
    00107
    00112     bool Coplanar(const CPlane &in_plane)const;
    00113
    00117     SICPPSDK_INLINE double GetDistance(const CVector3 &in_point)const;
    00118
    00124     SICPPSDK_INLINE CVector3 GetPosition(double in_U, double inV)const;
    00125
    00130     void GetParameters(const CVector3 &in_point, double &out_U, double &out_V)const;
    00131
    00137     bool Intersect(const CLine &in_line, CVector3 &out_point)const;
    00138
    00142     SICPPSDK_INLINE CVector3 Project(const CVector3 &in_point)const;
    00143
    00147     SICPPSDK_INLINE CVector3 Reflect(const CVector3 &in_point)const;
    00148
    00152     SICPPSDK_INLINE CLine ProjectLine(const CLine &in_line)const;
    00153
    00157     SICPPSDK_INLINE CLine ReflectLine(const CLine &in_line)const;
    00158
    00163     CMatrix4 & GetMirrorTransform(CMatrix4 &out_matrix4)const;
    00164
    00168     SICPPSDK_INLINE const CVector3 &GetOrigin()const;
    00169
    00173     SICPPSDK_INLINE const CVector3 &GetNormal()const;
    00174
    00178     SICPPSDK_INLINE const CVector3 &GetTangentU()const;
    00179
    00183     SICPPSDK_INLINE const CVector3 &GetTangentV()const;
    00184
    00189     SICPPSDK_INLINE CPlane &SetOrigin(const CVector3 &in_point);
    00190
    00195     CPlane &SetNormal(const CVector3 &in_normal);
    00196
    00202     CPlane &SetTangents(const CVector3 &in_U, const CVector3 &in_V);
    00203
    00209     SICPPSDK_INLINE CPlane &Set(const CVector3 &in_point, const CVector3 &in_normal);
    00210
    00217     SICPPSDK_INLINE CPlane &Set(const CVector3 &in_point, const CVector3 &in_U, const CVector3 &in_V);
    00218
    00224     SICPPSDK_INLINE CPlane& operator *=(const CMatrix3& in_matrix3);
    00225
    00231     SICPPSDK_INLINE CPlane& operator *=(const CMatrix4& in_matrix4);
    00232
    00238     SICPPSDK_INLINE CPlane& operator *=(const CTransformation& in_transformation);
    00239
    00244     SICPPSDK_INLINE CPlane& MulByMatrix3InPlace(const CMatrix3& in_matrix3);
    00245
    00251     SICPPSDK_INLINE CPlane& MulByMatrix3(const CPlane &in_plane, const CMatrix3 &in_matrix3);
    00252
    00257     SICPPSDK_INLINE CPlane& MulByMatrix4InPlace(const CMatrix4& in_matrix4);
    00258
    00264     SICPPSDK_INLINE CPlane& MulByMatrix4(const CPlane &in_plane, const CMatrix4 &in_matrix4);
    00265
    00270     SICPPSDK_INLINE CPlane& MulByTransformationInPlace(const CTransformation &in_transformation);
    00271
    00277     SICPPSDK_INLINE CPlane& MulByTransformation(const CPlane &in_plane, const CTransformation &in_transformation);
    00278
    00279 private:
    00280     CVector3    m_vOrigin;
    00281     CVector3    m_vNormal;
    00282     CVector3    m_vTangentU;
    00283     CVector3    m_vTangentV;
    00284 };
    00285
    00286 //inline functions
    00287 SICPPSDK_INLINE CPlane::CPlane()
    00288 : m_vOrigin(0.0, 0.0, 0.0), m_vTangentU(1.0, 0.0, 0.0), m_vTangentV(0.0, 1.0, 0.0), m_vNormal( 0.0, 0.0, 1.0 )
    00289 {
    00290 }
    00291
    00292 SICPPSDK_INLINE CPlane::CPlane( const CPlane& in_plane )
    00293 : m_vOrigin(in_plane.m_vOrigin), m_vTangentU(in_plane.m_vTangentU), m_vTangentV(in_plane.m_vTangentV), m_vNormal(in_plane.m_vNormal)
    00294 {
    00295 }
    00296
    00297 SICPPSDK_INLINE CPlane::~CPlane()
    00298 {}
    00299
    00300 SICPPSDK_INLINE CPlane::CPlane( const CVector3 &in_pt, const CVector3 &in_normal )
    00301 : m_vOrigin(in_pt)
    00302 {
    00303     SetNormal( in_normal );
    00304 }
    00305
    00306 SICPPSDK_INLINE CPlane::CPlane( const CVector3 &in_pt, const CVector3 &in_U, const CVector3 &in_V )
    00307 : m_vOrigin(in_pt)
    00308 {
    00309     SetTangents( in_U, in_V );
    00310 }
    00311
    00312 SICPPSDK_INLINE CPlane& CPlane::operator=( const CPlane & in_plane )
    00313 {
    00314     m_vOrigin   = in_plane.m_vOrigin;
    00315     m_vNormal   = in_plane.m_vNormal;
    00316     m_vTangentU = in_plane.m_vTangentU;
    00317     m_vTangentV = in_plane.m_vTangentV;
    00318     return *this;
    00319 }
    00320
    00321 SICPPSDK_INLINE const CVector3 &CPlane::GetOrigin()const
    00322 {
    00323     return m_vOrigin;
    00324 }
    00325
    00326 SICPPSDK_INLINE const CVector3 &CPlane::GetNormal()const
    00327 {
    00328     return m_vNormal;
    00329 }
    00330
    00331 SICPPSDK_INLINE const CVector3 &CPlane::GetTangentU()const
    00332 {
    00333     return m_vTangentU;
    00334 }
    00335
    00336 SICPPSDK_INLINE const CVector3 &CPlane::GetTangentV()const
    00337 {
    00338     return m_vTangentV;
    00339 }
    00340
    00341 SICPPSDK_INLINE CPlane & CPlane::Set(const CVector3 &in_point, const CVector3 &in_normal)
    00342 {
    00343     return SetOrigin( in_point ).SetNormal( in_normal );
    00344 }
    00345
    00346 SICPPSDK_INLINE CPlane & CPlane::Set(const CVector3 &in_point, const CVector3 &in_U, const CVector3 &in_V)
    00347 {
    00348     return SetOrigin( in_point ).SetTangents( in_U, in_V );
    00349 }
    00350
    00351 SICPPSDK_INLINE bool CPlane::EpsilonEquals(const CPlane& in_plane, double in_dEpsilon)const
    00352 {
    00353     return (this == &in_plane ? true :
    00354             (m_vOrigin.EpsilonEquals(in_plane.m_vOrigin, in_dEpsilon) &&
    00355              m_vNormal.EpsilonEquals(in_plane.m_vNormal, in_dEpsilon) &&
    00356              m_vTangentU.EpsilonEquals(in_plane.m_vTangentU, in_dEpsilon) &&
    00357              m_vTangentV.EpsilonEquals(in_plane.m_vTangentV, in_dEpsilon)));
    00358 }
    00359
    00360
    00361 SICPPSDK_INLINE bool CPlane::Equals(const CPlane& in_plane)const
    00362 {
    00363     return (this == &in_plane ? true :
    00364             (m_vOrigin.Equals(in_plane.m_vOrigin) &&
    00365              m_vNormal.Equals(in_plane.m_vNormal) &&
    00366              m_vTangentU.Equals(in_plane.m_vTangentU) &&
    00367              m_vTangentV.Equals(in_plane.m_vTangentV)));
    00368 }
    00369
    00370 SICPPSDK_INLINE bool CPlane::operator ==(const CPlane & in_plane )const
    00371 {
    00372     return Equals(in_plane);
    00373 }
    00374
    00375 SICPPSDK_INLINE bool CPlane::operator !=(const CPlane & in_plane )const
    00376 {
    00377     return !Equals(in_plane);
    00378 }
    00379
    00380 SICPPSDK_INLINE CVector3 CPlane::GetPosition(double in_u, double in_v)const
    00381 {
    00382     CVector3 l_Tmp, l_Result( m_vOrigin );
    00383     l_Result.AddInPlace( l_Tmp.Scale( in_u, m_vTangentU ) );
    00384     l_Result.AddInPlace( l_Tmp.Scale( in_v, m_vTangentV ) );
    00385     return l_Result;
    00386 }
    00387
    00388 SICPPSDK_INLINE CPlane & CPlane::SetOrigin(const CVector3 &in_point)
    00389 {
    00390     m_vOrigin = in_point;
    00391     return *this;
    00392 }
    00393
    00394 SICPPSDK_INLINE CVector3 CPlane::Project(const CVector3 &in_point)const
    00395 {
    00396     double l_dU = 0.0, l_dV = 0.0;
    00397     GetParameters( in_point, l_dU, l_dV );
    00398     return GetPosition(l_dU, l_dV);
    00399 }
    00400
    00401 SICPPSDK_INLINE CVector3 CPlane::Reflect(const CVector3 &in_point)const
    00402 {
    00403     return Project(in_point).ScaleInPlace(2.0).SubInPlace(in_point);
    00404 }
    00405
    00406 SICPPSDK_INLINE CLine CPlane::ProjectLine(const CLine &in_line)const
    00407 {
    00408     CVector3 l_Origin  = Project( in_line.GetOrigin() );
    00409     CVector3 l_Tangent = Project( in_line.GetPosition( 1.0 ) ).SubInPlace( l_Origin );
    00410     return CLine( l_Origin, l_Tangent );
    00411 }
    00412
    00413 SICPPSDK_INLINE CLine CPlane::ReflectLine(const CLine &in_line)const
    00414 {
    00415     CVector3 l_Origin  = Reflect( in_line.GetOrigin() );
    00416     CVector3 l_Tangent = Reflect( in_line.GetPosition( 1.0 ) ).SubInPlace( l_Origin );
    00417     return CLine( l_Origin, l_Tangent );
    00418 }
    00419
    00420 SICPPSDK_INLINE double CPlane::GetDistance(const CVector3 &in_point)const
    00421 {
    00422     return Project(in_point).SubInPlace(in_point).GetLength();
    00423 }
    00424
    00425 SICPPSDK_INLINE CPlane& CPlane::MulByMatrix3(const CPlane& in_plane, const CMatrix3& in_matrix3)
    00426 {
    00427     CVector3 l_NewOrigin, l_NewU, l_NewV;
    00428     l_NewOrigin.MulByMatrix3(in_plane.m_vOrigin, in_matrix3);
    00429     l_NewU.Add(in_plane.m_vOrigin, in_plane.m_vTangentU).MulByMatrix3InPlace(in_matrix3).SubInPlace(l_NewOrigin);
    00430     l_NewV.Add(in_plane.m_vOrigin, in_plane.m_vTangentV).MulByMatrix3InPlace(in_matrix3).SubInPlace(l_NewOrigin);
    00431     return Set(l_NewOrigin, l_NewU, l_NewV);
    00432 }
    00433
    00434 SICPPSDK_INLINE CPlane& CPlane::MulByMatrix4(const CPlane& in_plane, const CMatrix4& in_matrix4)
    00435 {
    00436     CVector3 l_NewOrigin, l_NewU, l_NewV;
    00437     l_NewOrigin.MulByMatrix4(in_plane.m_vOrigin, in_matrix4);
    00438     l_NewU.Add(in_plane.m_vOrigin, in_plane.m_vTangentU).MulByMatrix4InPlace(in_matrix4).SubInPlace(l_NewOrigin);
    00439     l_NewV.Add(in_plane.m_vOrigin, in_plane.m_vTangentV).MulByMatrix4InPlace(in_matrix4).SubInPlace(l_NewOrigin);
    00440     return Set(l_NewOrigin, l_NewU, l_NewV);
    00441 }
    00442
    00443 SICPPSDK_INLINE CPlane& CPlane::MulByTransformation(const CPlane &in_plane, const CTransformation &in_transformation)
    00444 {
    00445     CVector3 l_NewOrigin, l_NewU, l_NewV;
    00446     l_NewOrigin.MulByTransformation(in_plane.m_vOrigin, in_transformation);
    00447     l_NewU.Add(in_plane.m_vOrigin, in_plane.m_vTangentU).MulByTransformationInPlace(in_transformation).SubInPlace(l_NewOrigin);
    00448     l_NewV.Add(in_plane.m_vOrigin, in_plane.m_vTangentV).MulByTransformationInPlace(in_transformation).SubInPlace(l_NewOrigin);
    00449     return Set(l_NewOrigin, l_NewU, l_NewV);
    00450 }
    00451
    00452 SICPPSDK_INLINE CPlane& CPlane::MulByMatrix3InPlace(const CMatrix3& in_matrix3)
    00453 {
    00454     return MulByMatrix3(*this, in_matrix3);
    00455 }
    00456
    00457 SICPPSDK_INLINE CPlane& CPlane::MulByMatrix4InPlace(const CMatrix4& in_matrix4)
    00458 {
    00459     return MulByMatrix4(*this, in_matrix4);
    00460 }
    00461
    00462 SICPPSDK_INLINE CPlane& CPlane::MulByTransformationInPlace(const CTransformation& in_crTrans)
    00463 {
    00464     return MulByTransformation(*this, in_crTrans);
    00465 }
    00466
    00467 SICPPSDK_INLINE CPlane& CPlane::operator *=(const CMatrix3& in_matrix3)
    00468 {
    00469     return MulByMatrix3InPlace(in_matrix3);
    00470 }
    00471
    00472 SICPPSDK_INLINE CPlane& CPlane::operator *=(const CMatrix4& in_matrix4)
    00473 {
    00474     return MulByMatrix4InPlace(in_matrix4);
    00475 }
    00476
    00477 SICPPSDK_INLINE CPlane& CPlane::operator *=(const CTransformation& in_transformation)
    00478 {
    00479     return MulByTransformationInPlace(in_transformation);
    00480 }
    00481
    00482 };
    00483 };
    00484
    00485 #endif // __XSIPLANE_H__