00001
00002
00003 #include "geometry/Helix.h"
00004
00005
00006 static double sinSave, cosSave, rhoSave, stepSave, perpSave;
00007
00008
00009 Helix::Helix( const Point& p, const Vector& d,
00010 const Vector& a, double r )
00011 : Ray( p, d ) ,axis(a.unit()), rho(r)
00012 { perp = axis.cross( dir );
00013 perpSave = perp.magnitude();
00014 parallel = axis * dir;
00015 stepSave = sinSave = rhoSave = 0.0;
00016 cosSave = 1.0;
00017 }
00018
00019 Helix::Helix( const Helix& h ) : Ray( h.pos, h.dir )
00020 {
00021 axis = h.axis;
00022 rho = h.rho;
00023 perp = h.perp;
00024 parallel = h.parallel;
00025 arclength = h.arclength;
00026 }
00027
00028 void Helix::printOn( std::ostream& os ) const
00029 {
00030 os << "Helix: origin " << Ray::position()
00031 << " dir " << Ray::direction() << " axis "
00032 << axis << " radius " << rho << "\n";
00033 }
00034 inline void
00035 Helix::updateCache(double step)const
00036 {
00037 if ( step != stepSave || rho != rhoSave) {
00038 stepSave = step;
00039 rhoSave = rho;
00040 perpSave = perp.magnitude();
00041 cosSave = cos( step * perpSave / rho );
00042 sinSave = sin( step * perpSave / rho );
00043 }
00044
00045 }
00046
00047 Point Helix::position( double step ) const
00048 {
00049 updateCache(step);
00050 double a = parallel * ( step - rho * sinSave / perpSave )
00051 ,d = rho * sinSave/perpSave;
00052 Point p = pos;
00053 p += d*dir;
00054 p += a* axis;
00055 p += ( rho * ( 1.0 - cosSave ) / perpSave ) * perp;
00056 return p;
00057
00058
00059
00060
00061
00062
00063 }
00064
00065 Vector
00066 Helix::direction( double step ) const
00067 {
00068 updateCache(step);
00069 return cosSave * dir
00070 + parallel * ( 1.0 - cosSave ) * axis
00071 + sinSave * perp;
00072 }
00073 GeomObject&
00074 Helix::transform(const CoordTransform& T)
00075 {
00076 Ray::transform(T);
00077 axis.transform(T);
00078 perp.transform(T);
00079 return *this;
00080 }
00081
00082