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