Main Page   Class Hierarchy   Compound List   File List   Compound Members   File Members  

Helix.cxx

Go to the documentation of this file.
00001 // $Id: Helix.cxx,v 1.1.1.1 1999/12/20 22:28:06 burnett Exp $
00002 
00003 #include "geometry/Helix.h"
00004 
00005 //  static variables for efficiency of position, direction
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 {  // printing function using C++ ostream class
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  /*  return    pos
00058                 + d* dir
00059                 + a * axis
00060                 + ( rho * ( 1.0 - cosSave ) / perpSave ) * perp
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 

Generated at Wed Nov 21 12:20:12 2001 by doxygen1.2.3 written by Dimitri van Heesch, © 1997-2000