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