xsi_line.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 __XSILINE_H__
    00018 #define __XSILINE_H__
    00019
    00020 #include "sicppsdk.h"
    00021 #include "xsi_status.h"
    00022 #include "xsi_vector3.h"
    00023 #include <math.h>
    00024
    00025 namespace XSI {
    00026
    00027 namespace MATH {
    00028
    00029 //*****************************************************************************
    00039 //*****************************************************************************
    00040 class SICPPSDKDECL CLine
    00041 {
    00042 public:
    00044     SICPPSDK_INLINE CLine();
    00045
    00050     SICPPSDK_INLINE CLine( const CVector3 &in_point, const CVector3 &in_tangent );
    00051
    00055     SICPPSDK_INLINE CLine( const CLine &in_line );
    00056
    00058     SICPPSDK_INLINE ~CLine();
    00059
    00064     SICPPSDK_INLINE CLine & operator=( const CLine & in_line );
    00065
    00071     SICPPSDK_INLINE bool operator ==(const CLine &in_line )const;
    00072
    00078     SICPPSDK_INLINE bool operator !=(const CLine &in_line )const;
    00079
    00086     SICPPSDK_INLINE bool EpsilonEquals(const CLine &in_line, double in_dEpsilon)const;
    00087
    00092     SICPPSDK_INLINE bool Equals(const CLine &in_line)const;
    00093
    00098     bool Parallel(const CLine &in_line)const;
    00099
    00104     bool Collinear(const CLine &in_line)const;
    00105
    00109     SICPPSDK_INLINE CVector3 Project(const CVector3 &in_point)const;
    00110
    00114     SICPPSDK_INLINE CVector3 GetClosestPoint(const CLine &in_line)const;
    00115
    00119     SICPPSDK_INLINE double GetDistance(const CVector3 &in_point)const;
    00120
    00124     SICPPSDK_INLINE double GetDistance(const CLine &in_line)const;
    00125
    00130     SICPPSDK_INLINE CVector3 GetPosition(double in_param)const;
    00131
    00135     double GetParameter(const CVector3 &in_point)const;
    00136
    00142     bool Intersect(const CLine &in_line, CVector3 &out_point)const;
    00143
    00147     SICPPSDK_INLINE const CVector3 &GetOrigin()const;
    00148
    00152     SICPPSDK_INLINE const CVector3 &GetTangent()const;
    00153
    00158     SICPPSDK_INLINE CLine &SetOrigin(const CVector3 &in_point);
    00159
    00164     SICPPSDK_INLINE CLine &SetTangent(const CVector3 &in_tangent);
    00165
    00171     SICPPSDK_INLINE CLine &Set(const CVector3 &in_point, const CVector3 &in_tangent);
    00172
    00178     SICPPSDK_INLINE CLine& operator *=(const CMatrix3& in_matrix3);
    00179
    00185     SICPPSDK_INLINE CLine& operator *=(const CMatrix4& in_matrix4);
    00186
    00192     SICPPSDK_INLINE CLine& operator *=(const CTransformation& in_transformation);
    00193
    00198     SICPPSDK_INLINE CLine& MulByMatrix3InPlace(const CMatrix3& in_matrix3);
    00199
    00205     SICPPSDK_INLINE CLine& MulByMatrix3(const CLine &in_line, const CMatrix3 &in_matrix3);
    00206
    00211     SICPPSDK_INLINE CLine& MulByMatrix4InPlace(const CMatrix4& in_matrix4);
    00212
    00218     SICPPSDK_INLINE CLine& MulByMatrix4(const CLine &in_line, const CMatrix4 &in_matrix4);
    00219
    00224     SICPPSDK_INLINE CLine& MulByTransformationInPlace(const CTransformation &in_transformation);
    00225
    00231     SICPPSDK_INLINE CLine& MulByTransformation(const CLine &in_line, const CTransformation &in_transformation);
    00232
    00233 private:
    00234     CVector3    m_vOrigin;
    00235     CVector3    m_vTangent;
    00236 };
    00237
    00238 //inline functions
    00239 SICPPSDK_INLINE CLine::CLine()
    00240 : m_vOrigin(0.0, 0.0, 0.0), m_vTangent(1.0, 0.0, 0.0)
    00241 {
    00242 }
    00243
    00244 SICPPSDK_INLINE CLine::CLine( const CLine& in_line )
    00245 : m_vOrigin(in_line.m_vOrigin), m_vTangent(in_line.m_vTangent)
    00246 {
    00247 }
    00248
    00249 SICPPSDK_INLINE CLine::CLine( const CVector3 &in_pt, const CVector3 &in_dir )
    00250 : m_vOrigin(in_pt), m_vTangent(in_dir)
    00251 {}
    00252
    00253 SICPPSDK_INLINE CLine::~CLine()
    00254 {}
    00255
    00256 SICPPSDK_INLINE CLine& CLine::operator=( const CLine & in_line )
    00257 {
    00258     m_vOrigin = in_line.m_vOrigin;
    00259     m_vTangent = in_line.m_vTangent;
    00260     return *this;
    00261 }
    00262
    00263 SICPPSDK_INLINE const CVector3 &CLine::GetOrigin()const
    00264 {
    00265     return m_vOrigin;
    00266 }
    00267
    00268 SICPPSDK_INLINE const CVector3 &CLine::GetTangent()const
    00269 {
    00270     return m_vTangent;
    00271 }
    00272
    00273 SICPPSDK_INLINE bool CLine::EpsilonEquals(const CLine& in_line, double in_dEpsilon)const
    00274 {
    00275     return (this == &in_line ? true :
    00276             (m_vOrigin.EpsilonEquals(in_line.m_vOrigin, in_dEpsilon) &&
    00277              m_vTangent.EpsilonEquals(in_line.m_vTangent, in_dEpsilon)));
    00278 }
    00279
    00280
    00281 SICPPSDK_INLINE bool CLine::Equals(const CLine& in_line)const
    00282 {
    00283     return (this == &in_line ? true :
    00284             (m_vOrigin.Equals(in_line.m_vOrigin) &&
    00285              m_vTangent.Equals(in_line.m_vTangent)));
    00286 }
    00287
    00288 SICPPSDK_INLINE bool CLine::operator ==(const CLine & in_line )const
    00289 {
    00290     return Equals(in_line);
    00291 }
    00292
    00293 SICPPSDK_INLINE bool CLine::operator !=(const CLine & in_line )const
    00294 {
    00295     return !Equals(in_line);
    00296 }
    00297
    00298 SICPPSDK_INLINE CVector3 CLine::GetPosition(double in_param)const
    00299 {
    00300     CVector3 l_Result;
    00301     l_Result.ScaleAdd( in_param, m_vTangent, m_vOrigin );
    00302     return l_Result;
    00303 }
    00304
    00305 SICPPSDK_INLINE CLine & CLine::SetOrigin(const CVector3 &in_point)
    00306 {
    00307     m_vOrigin = in_point;
    00308     return *this;
    00309 }
    00310
    00311 SICPPSDK_INLINE CLine &CLine::SetTangent(const CVector3 &in_tangent)
    00312 {
    00313     m_vTangent = in_tangent;
    00314     return *this;
    00315 }
    00316
    00317 SICPPSDK_INLINE CLine & CLine::Set(const CVector3 &in_point, const CVector3 &in_tangent)
    00318 {
    00319     m_vOrigin = in_point;
    00320     m_vTangent = in_tangent;
    00321     return *this;
    00322 }
    00323
    00324 SICPPSDK_INLINE CVector3 CLine::Project(const CVector3 &in_point)const
    00325 {
    00326     return GetPosition(GetParameter(in_point));
    00327 }
    00328
    00329 SICPPSDK_INLINE CVector3 CLine::GetClosestPoint(const CLine &in_line)const
    00330 {
    00331     CVector3 l_Closest;
    00332     Intersect( in_line, l_Closest );
    00333     return l_Closest;
    00334 }
    00335
    00336 SICPPSDK_INLINE double CLine::GetDistance(const CVector3 &in_point)const
    00337 {
    00338     return Project(in_point).SubInPlace(in_point).GetLength();
    00339 }
    00340
    00341 SICPPSDK_INLINE double CLine::GetDistance(const CLine &in_line)const
    00342 {
    00343     CVector3 l_Tmp;
    00344     return ( Intersect( in_line, l_Tmp ) ? 0.0 : GetDistance( in_line.m_vOrigin ) );
    00345 }
    00346
    00347 SICPPSDK_INLINE CLine& CLine::MulByMatrix3(const CLine& in_line, const CMatrix3& in_matrix3)
    00348 {
    00349     CVector3 l_NewOrigin, l_NewTangent;
    00350     l_NewOrigin.MulByMatrix3(in_line.m_vOrigin, in_matrix3);
    00351     l_NewTangent.Add(in_line.m_vOrigin, in_line.m_vTangent);
    00352     l_NewTangent.MulByMatrix3InPlace(in_matrix3);
    00353     l_NewTangent.SubInPlace(l_NewOrigin);
    00354     return Set(l_NewOrigin, l_NewTangent);
    00355 }
    00356
    00357 SICPPSDK_INLINE CLine& CLine::MulByMatrix4(const CLine& in_line, const CMatrix4& in_matrix4)
    00358 {
    00359     CVector3 l_NewOrigin, l_NewTangent;
    00360     l_NewOrigin.MulByMatrix4(in_line.m_vOrigin, in_matrix4);
    00361     l_NewTangent.Add(in_line.m_vOrigin, in_line.m_vTangent);
    00362     l_NewTangent.MulByMatrix4InPlace(in_matrix4);
    00363     l_NewTangent.SubInPlace(l_NewOrigin);
    00364     return Set(l_NewOrigin, l_NewTangent);
    00365 }
    00366
    00367 SICPPSDK_INLINE CLine& CLine::MulByTransformation(const CLine &in_line, const CTransformation &in_transformation)
    00368 {
    00369     CVector3 l_NewOrigin, l_NewTangent;
    00370     l_NewOrigin.MulByTransformation(in_line.m_vOrigin, in_transformation);
    00371     l_NewTangent.Add(in_line.m_vOrigin, in_line.m_vTangent);
    00372     l_NewTangent.MulByTransformationInPlace(in_transformation);
    00373     l_NewTangent.SubInPlace(l_NewOrigin);
    00374     return Set(l_NewOrigin, l_NewTangent);
    00375 }
    00376
    00377 SICPPSDK_INLINE CLine& CLine::MulByMatrix3InPlace(const CMatrix3& in_matrix3)
    00378 {
    00379     return MulByMatrix3(*this, in_matrix3);
    00380 }
    00381
    00382 SICPPSDK_INLINE CLine& CLine::MulByMatrix4InPlace(const CMatrix4& in_matrix4)
    00383 {
    00384     return MulByMatrix4(*this, in_matrix4);
    00385 }
    00386
    00387 SICPPSDK_INLINE CLine& CLine::MulByTransformationInPlace(const CTransformation& in_crTrans)
    00388 {
    00389     return MulByTransformation(*this, in_crTrans);
    00390 }
    00391
    00392 SICPPSDK_INLINE CLine& CLine::operator *=(const CMatrix3& in_matrix3)
    00393 {
    00394     return MulByMatrix3InPlace(in_matrix3);
    00395 }
    00396
    00397 SICPPSDK_INLINE CLine& CLine::operator *=(const CMatrix4& in_matrix4)
    00398 {
    00399     return MulByMatrix4InPlace(in_matrix4);
    00400 }
    00401
    00402 SICPPSDK_INLINE CLine& CLine::operator *=(const CTransformation& in_transformation)
    00403 {
    00404     return MulByTransformationInPlace(in_transformation);
    00405 }
    00406
    00407 };
    00408 };
    00409
    00410 #endif // __XSILINE_H__