00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include <base/ParametricTrajectoryRep>
00026
00027 #include <base/Serializer>
00028
00029 using base::ParametricTrajectoryRep;
00030
00031 using base::Time;
00032
00033 ParametricTrajectoryRep::ParametricTrajectoryRep(const ExpressionVector& p)
00034 {
00035 Assert( (p.size() == 4) || (p.size() == 7) || (p.size() == 8) );
00036
00037 if (p.size() != 4)
00038 flags = HasOrient;
00039
00040 v.resize(p.size()-1);
00041 for(Int i=0; i<v.size(); i++)
00042 v[i] = p[i];
00043
00044
00045
00046 Expression f = p[p.size()-1];
00047
00048 Real a,b;
00049 times = f;
00050 linearFit(a,b);
00051
00052 if (a <= 0.0)
00053 throw std::invalid_argument(Exception("the function t(s) must be linear and monotonically increasing"));
00054
00055
00056 Expression lf = Expression::p[0]*a + b;
00057 lf.simplify();
00058
00059
00060 Vector param(1);
00061 for(Real s=0; s<=1.0; s+=1/10.0) {
00062 param[0]=s;
00063 if (!Math::equals( lf.evaluate(param), f.evaluate(param) ) )
00064 throw std::invalid_argument(Exception("the function t(s) must be linear"));
00065 }
00066
00067 times = lf;
00068
00069 }
00070
00071
00072 void ParametricTrajectoryRep::linearFit(Real& a, Real &b) const
00073 {
00074
00075 Real t0 = eval(0);
00076 Real t1 = eval(1);
00077
00078 a = t1-t0;
00079 b = t0;
00080 }
00081
00082
00083 Time ParametricTrajectoryRep::time(Real s) const
00084 {
00085 Math::bound<Real>(s,0,1);
00086 return eval(s);
00087 }
00088
00089
00090 void ParametricTrajectoryRep::shiftTime(const Time& dt)
00091 {
00092 times = times + Expression(dt.seconds());
00093 times.simplify();
00094 }
00095
00096
00097 void ParametricTrajectoryRep::scaleTime(Real s)
00098 {
00099 times = Expression(s)*times;
00100 times.simplify();
00101 }
00102
00103
00104 Real ParametricTrajectoryRep::gets(const Time& t) const
00105 {
00106
00107
00108 Real t0 = eval(0);
00109 Real t1 = eval(1);
00110 Real bt(t.seconds());
00111 Math::bound<Real>(bt,t0,t1);
00112
00113 Real a,b;
00114 linearFit(a,b);
00115
00116 if (a==0) return 0;
00117
00118 return(bt-b)/a;
00119 }
00120
00121
00122 void ParametricTrajectoryRep::serialize(Serializer& s)
00123 {
00124 ParametricPathRep::serialize(s);
00125 s(times,"times");
00126 }
00127
00128