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

NaturalCurve.H

Go to the documentation of this file.
00001 
00013 #ifndef _NATURALCURVE_H
00014 #define _NATURALCURVE_H
00015 
00016 #include <Frenet.H>
00017 #include <Model.H>
00018 
00019 namespace xchen 
00020 {
00022   class NaturalCurve : public Model
00023   {
00024   public:
00025       typedef double (*KapaFun)(double);
00026       typedef double (*TauFun)(double);
00027 
00028   public:      
00029       NaturalCurve(KapaFun kapa, TauFun tau, const Frame& f=Frame(), double stp=0.01);
00030       void Generate(double stepsize = 0.01);
00031 
00032   private:
00033       vector<Frenet> frenets;
00034       double step;
00035       KapaFun k;
00036       TauFun t;
00037 
00038       bool stop() const { return frenets.size() > 9000; }
00039   };
00040 
00041   inline NaturalCurve :: NaturalCurve(KapaFun kapa, TauFun tau, const Frame& f, double stp) : k(kapa), t(tau), step(0) 
00042   { 
00043     Frenet frt(f, k(0), t(0));
00044 
00045     double 
00046       diag = sqrt( t(0) * t(0) + k(0) * k(0) ),
00047       cn =  k(0) / diag, 
00048       sn = t(0) / diag, 
00049       cn2 = k(0) * k(0) / (t(0) * t(0) + k(0) * k(0)),
00050       r = cn2 / k(0);
00051 
00052     frt.f1 = dVector3D( cn, 0, sn );
00053     frt.f3 = dVector3D( -sn, 0, cn );
00054     frt.pos[1] -= r;
00055       
00056     frenets.push_back( frt ); 
00057     Generate(stp); 
00058   }
00059 
00060   inline void NaturalCurve :: Generate(double stepsize)
00061   {
00062     if(step != stepsize)
00063       frenets.erase(frenets.begin()+1, frenets.end());
00064 
00065     frenets.reserve(9100);
00066 
00067     step = stepsize;
00068  
00069     double s = step * (frenets.size()-1);
00070       
00071     cout << "in generating\n";
00072       
00073     for(int i=0; !stop(); i++)
00074     {
00075       Frenet& prev_frt = frenets.back();
00076       frenets.push_back( prev_frt );
00077       Frenet& cur_frt = frenets.back();
00078 
00079       cur_frt.pos += prev_frt.f1 * step;
00080 
00081       cur_frt.f1 += prev_frt.f2 * prev_frt.k * step;
00082       cur_frt.f3 -= prev_frt.f2 * prev_frt.t * step;
00083       cur_frt.f2 += (-prev_frt.f1 * prev_frt.k + prev_frt.f3 * prev_frt.t) * step;
00084 
00085       s += step;
00086       cur_frt.k = k(s);
00087       cur_frt.t = t(s);
00088 
00089       if( !(i%5) )
00090       {
00091         cur_frt.f1.Normalize();
00092         cur_frt.f2.Normalize();
00093         cur_frt.f3.Normalize();
00094       }
00095 
00096       if(i>9000)                                                             
00097         cout << "frenets.max_size() is " <<  frenets.max_size() << endl;
00098     }
00099     cout << "generating done\n";
00100   }
00101       
00102 }
00103 
00104 #endif

Generated on Wed Apr 7 21:40:49 2004 by doxygen1.2.18