Main Page   Modules   Class Hierarchy   Compound List   File List   Compound Members   File Members   Related Pages   Examples  

math/path.cpp

Go to the documentation of this file.
00001 #include "path.h"
00002 
00007 #include <cmath>
00008 #include <cassert>
00009 using namespace std;
00010 
00011 GltPath3D::GltPath3D()
00012 {
00013 }
00014 
00015 GltPath3D::~GltPath3D()
00016 {
00017 }
00018 
00020 
00021 GltPath3DLine::GltPath3DLine(const Vector &origin,const Vector &direction)
00022 : _origin(origin), _direction(direction)
00023 {
00024 }
00025 
00026 Vector
00027 GltPath3DLine::f(const real t) const
00028 {
00029     return _origin + _direction*t;
00030 }
00031 
00032 Vector 
00033 GltPath3DLine::df(const real t) const
00034 {
00035     return _direction;
00036 }
00037 
00038 Vector 
00039 GltPath3DLine::ddf(const real t) const
00040 {
00041     return Vector0;
00042 }
00043 
00045 
00046 GltPath3DHelix::GltPath3DHelix(const Vector &origin,const Vector &direction,const real radius,const real freq,const real phase)
00047 : _origin(origin), _direction(direction), _radius(radius), _freq(freq), _phase(phase)
00048 {
00049     Vector dir = _direction;
00050     dir.normalize();
00051     const real angle = acos(dir*VectorZ);
00052 
00053     if (fabs(angle)>0.01)
00054         _trans = matrixRotate(xProduct(_direction,VectorZ),angle);
00055 }
00056 
00057 Vector
00058 GltPath3DHelix::f(const real t) const
00059 {
00060     Vector orbit = VectorX*sin(t*_freq*M_2PI+_phase) + VectorY*cos(t*_freq*M_2PI+_phase);
00061     orbit = orbit * _radius;
00062     return _origin + _direction*t + _trans*orbit; 
00063 }
00064 
00065 Vector 
00066 GltPath3DHelix::df(const real t) const
00067 {
00068     Vector orbit = VectorX*cos(t*_freq*M_2PI+_phase) - VectorY*sin(t*_freq*M_2PI+_phase);
00069     orbit = orbit * (_radius * _freq * M_2PI);
00070 
00071     return _direction + _trans*orbit;
00072 }
00073 
00074 Vector 
00075 GltPath3DHelix::ddf(const real t) const
00076 {
00077     Vector orbit = -VectorX*sin(t*_freq*M_2PI+_phase) - VectorY*cos(t*_freq*M_2PI+_phase);
00078     orbit = orbit * _radius * SQ(_freq*M_2PI);
00079 
00080     return _trans*orbit;
00081 }
00082 
00084 
00085 GltPath3DSegment::GltPath3DSegment(const GltPath3D &func,const real begin,const real end)
00086 : _func(func), _begin(begin), _end(end)
00087 {
00088     assert(_begin<_end);
00089     assert(CLAMP<real>(_begin,0.0,1.0)==_begin);
00090     assert(CLAMP<real>(_end,0.0,1.0)==_end);
00091 }
00092 
00093 
00094 Vector 
00095 GltPath3DSegment::f(const real t) const
00096 {
00097     return _func.f(segT(t));
00098 }
00099 
00100 Vector 
00101 GltPath3DSegment::df(const real t) const
00102 {
00103     return _func.df(segT(t));
00104 }
00105 
00106 Vector 
00107 GltPath3DSegment::ddf(const real t) const
00108 {
00109     return _func.ddf(segT(t));
00110 }
00111 
00112 real 
00113 GltPath3DSegment::segT(const real t) const
00114 {
00115     return (_end-_begin)*t+_begin;
00116 }
00117 
00118 
00119 

Generated on Tue Nov 5 11:11:04 2002 for GLT by doxygen1.2.18