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
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__