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
00026 #ifndef Rall2D_H
00027 #define Rall2D_H
00028
00029 #include <math.h>
00030 #include <assert.h>
00031 #include "utility.h"
00032
00033
00034 namespace KDL {
00035
00053 template <class T,class V=T,class S=T>
00054 class Rall2d
00055 {
00056 public :
00057 T t;
00058 V d;
00059 V dd;
00060 public :
00061
00062 INLINE Rall2d() {}
00063
00064 explicit INLINE Rall2d(typename TI<T>::Arg c)
00065 {t=c;SetToZero(d);SetToZero(dd);}
00066
00067 INLINE Rall2d(typename TI<T>::Arg tn,const V& afg):t(tn),d(afg) {SetToZero(dd);}
00068
00069 INLINE Rall2d(typename TI<T>::Arg tn,const V& afg,const V& afg2):t(tn),d(afg),dd(afg2) {}
00070
00071
00072 INLINE Rall2d(const Rall2d<T,V,S>& r):t(r.t),d(r.d),dd(r.dd) {}
00073
00074
00075
00076
00077
00078 INLINE T& Value() {
00079 return t;
00080 }
00081
00082 INLINE V& D() {
00083 return d;
00084 }
00085
00086 INLINE V& DD() {
00087 return dd;
00088 }
00089 INLINE static Rall2d<T,V,S> Zero() {
00090 Rall2d<T,V,S> tmp;
00091 SetToZero(tmp);
00092 return tmp;
00093 }
00094 INLINE static Rall2d<T,V,S> Identity() {
00095 Rall2d<T,V,S> tmp;
00096 SetToIdentity(tmp);
00097 return tmp;
00098 }
00099
00100
00101 INLINE Rall2d<T,V,S>& operator =(S c)
00102 {t=c;SetToZero(d);SetToZero(dd);return *this;}
00103
00104 INLINE Rall2d<T,V,S>& operator =(const Rall2d<T,V,S>& r)
00105 {t=r.t;d=r.d;dd=r.dd;return *this;}
00106
00107 INLINE Rall2d<T,V,S>& operator /=(const Rall2d<T,V,S>& rhs)
00108 {
00109 t /= rhs.t;
00110 d = (d-t*rhs.d)/rhs.t;
00111 dd= (dd - S(2)*d*rhs.d-t*rhs.dd)/rhs.t;
00112 return *this;
00113 }
00114
00115 INLINE Rall2d<T,V,S>& operator *=(const Rall2d<T,V,S>& rhs)
00116 {
00117 t *= rhs.t;
00118 d = (d*rhs.t+t*rhs.d);
00119 dd = (dd*rhs.t+S(2)*d*rhs.d+t*rhs.dd);
00120 return *this;
00121 }
00122
00123 INLINE Rall2d<T,V,S>& operator +=(const Rall2d<T,V,S>& rhs)
00124 {
00125 t +=rhs.t;
00126 d +=rhs.d;
00127 dd+=rhs.dd;
00128 return *this;
00129 }
00130
00131 INLINE Rall2d<T,V,S>& operator -=(const Rall2d<T,V,S>& rhs)
00132 {
00133 t -= rhs.t;
00134 d -= rhs.d;
00135 dd -= rhs.dd;
00136 return *this;
00137 }
00138
00139 INLINE Rall2d<T,V,S>& operator /=(S rhs)
00140 {
00141 t /= rhs;
00142 d /= rhs;
00143 dd /= rhs;
00144 return *this;
00145 }
00146
00147 INLINE Rall2d<T,V,S>& operator *=(S rhs)
00148 {
00149 t *= rhs;
00150 d *= rhs;
00151 dd *= rhs;
00152 return *this;
00153 }
00154
00155 INLINE Rall2d<T,V,S>& operator -=(S rhs)
00156 {
00157 t -= rhs;
00158 return *this;
00159 }
00160
00161 INLINE Rall2d<T,V,S>& operator +=(S rhs)
00162 {
00163 t += rhs;
00164 return *this;
00165 }
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218 };
00219
00220
00221
00222
00223
00224
00225 template <class T,class V,class S>
00226 INLINE Rall2d<T,V,S> operator /(const Rall2d<T,V,S>& lhs,const Rall2d<T,V,S>& rhs)
00227 {
00228 Rall2d<T,V,S> tmp;
00229 tmp.t = lhs.t/rhs.t;
00230 tmp.d = (lhs.d-tmp.t*rhs.d)/rhs.t;
00231 tmp.dd= (lhs.dd-S(2)*tmp.d*rhs.d-tmp.t*rhs.dd)/rhs.t;
00232 return tmp;
00233 }
00234
00235 template <class T,class V,class S>
00236 INLINE Rall2d<T,V,S> operator *(const Rall2d<T,V,S>& lhs,const Rall2d<T,V,S>& rhs)
00237 {
00238 Rall2d<T,V,S> tmp;
00239 tmp.t = lhs.t*rhs.t;
00240 tmp.d = (lhs.d*rhs.t+lhs.t*rhs.d);
00241 tmp.dd = (lhs.dd*rhs.t+S(2)*lhs.d*rhs.d+lhs.t*rhs.dd);
00242 return tmp;
00243 }
00244
00245 template <class T,class V,class S>
00246 INLINE Rall2d<T,V,S> operator +(const Rall2d<T,V,S>& lhs,const Rall2d<T,V,S>& rhs)
00247 {
00248 return Rall2d<T,V,S>(lhs.t+rhs.t,lhs.d+rhs.d,lhs.dd+rhs.dd);
00249 }
00250
00251 template <class T,class V,class S>
00252 INLINE Rall2d<T,V,S> operator -(const Rall2d<T,V,S>& lhs,const Rall2d<T,V,S>& rhs)
00253 {
00254 return Rall2d<T,V,S>(lhs.t-rhs.t,lhs.d-rhs.d,lhs.dd-rhs.dd);
00255 }
00256
00257 template <class T,class V,class S>
00258 INLINE Rall2d<T,V,S> operator -(const Rall2d<T,V,S>& arg)
00259 {
00260 return Rall2d<T,V,S>(-arg.t,-arg.d,-arg.dd);
00261 }
00262
00263 template <class T,class V,class S>
00264 INLINE Rall2d<T,V,S> operator *(S s,const Rall2d<T,V,S>& v)
00265 {
00266 return Rall2d<T,V,S>(s*v.t,s*v.d,s*v.dd);
00267 }
00268
00269 template <class T,class V,class S>
00270 INLINE Rall2d<T,V,S> operator *(const Rall2d<T,V,S>& v,S s)
00271 {
00272 return Rall2d<T,V,S>(v.t*s,v.d*s,v.dd*s);
00273 }
00274
00275 template <class T,class V,class S>
00276 INLINE Rall2d<T,V,S> operator +(S s,const Rall2d<T,V,S>& v)
00277 {
00278 return Rall2d<T,V,S>(s+v.t,v.d,v.dd);
00279 }
00280
00281 template <class T,class V,class S>
00282 INLINE Rall2d<T,V,S> operator +(const Rall2d<T,V,S>& v,S s)
00283 {
00284 return Rall2d<T,V,S>(v.t+s,v.d,v.dd);
00285 }
00286
00287 template <class T,class V,class S>
00288 INLINE Rall2d<T,V,S> operator -(S s,const Rall2d<T,V,S>& v)
00289 {
00290 return Rall2d<T,V,S>(s-v.t,-v.d,-v.dd);
00291 }
00292
00293 template <class T,class V,class S>
00294 INLINE Rall2d<T,V,S> operator -(const Rall2d<T,V,S>& v,S s)
00295 {
00296 return Rall2d<T,V,S>(v.t-s,v.d,v.dd);
00297 }
00298
00299 template <class T,class V,class S>
00300 INLINE Rall2d<T,V,S> operator /(S s,const Rall2d<T,V,S>& rhs)
00301 {
00302 Rall2d<T,V,S> tmp;
00303 tmp.t = s/rhs.t;
00304 tmp.d = (-tmp.t*rhs.d)/rhs.t;
00305 tmp.dd= (-S(2)*tmp.d*rhs.d-tmp.t*rhs.dd)/rhs.t;
00306 return tmp;
00307 }
00308
00309
00310 template <class T,class V,class S>
00311 INLINE Rall2d<T,V,S> operator /(const Rall2d<T,V,S>& v,S s)
00312 {
00313 return Rall2d<T,V,S>(v.t/s,v.d/s,v.dd/s);
00314 }
00315
00316
00317 template <class T,class V,class S>
00318 INLINE Rall2d<T,V,S> exp(const Rall2d<T,V,S>& arg)
00319 {
00320 Rall2d<T,V,S> tmp;
00321 tmp.t = exp(arg.t);
00322 tmp.d = tmp.t*arg.d;
00323 tmp.dd = tmp.d*arg.d+tmp.t*arg.dd;
00324 return tmp;
00325 }
00326
00327 template <class T,class V,class S>
00328 INLINE Rall2d<T,V,S> log(const Rall2d<T,V,S>& arg)
00329 {
00330 Rall2d<T,V,S> tmp;
00331 tmp.t = log(arg.t);
00332 tmp.d = arg.d/arg.t;
00333 tmp.dd = (arg.dd-tmp.d*arg.d)/arg.t;
00334 return tmp;
00335 }
00336
00337 template <class T,class V,class S>
00338 INLINE Rall2d<T,V,S> sin(const Rall2d<T,V,S>& arg)
00339 {
00340 T v1 = sin(arg.t);
00341 T v2 = cos(arg.t);
00342 return Rall2d<T,V,S>(v1,v2*arg.d,v2*arg.dd - (v1*arg.d)*arg.d );
00343 }
00344
00345 template <class T,class V,class S>
00346 INLINE Rall2d<T,V,S> cos(const Rall2d<T,V,S>& arg)
00347 {
00348 T v1 = cos(arg.t);
00349 T v2 = -sin(arg.t);
00350 return Rall2d<T,V,S>(v1,v2*arg.d, v2*arg.dd - (v1*arg.d)*arg.d);
00351 }
00352
00353 template <class T,class V,class S>
00354 INLINE Rall2d<T,V,S> tan(const Rall2d<T,V,S>& arg)
00355 {
00356 T v1 = tan(arg.t);
00357 T v2 = S(1)+sqr(v1);
00358 return Rall2d<T,V,S>(v1,v2*arg.d, v2*(arg.dd+(S(2)*v1*sqr(arg.d))));
00359 }
00360
00361 template <class T,class V,class S>
00362 INLINE Rall2d<T,V,S> sinh(const Rall2d<T,V,S>& arg)
00363 {
00364 T v1 = sinh(arg.t);
00365 T v2 = cosh(arg.t);
00366 return Rall2d<T,V,S>(v1,v2*arg.d,v2*arg.dd + (v1*arg.d)*arg.d );
00367 }
00368
00369 template <class T,class V,class S>
00370 INLINE Rall2d<T,V,S> cosh(const Rall2d<T,V,S>& arg)
00371 {
00372 T v1 = cosh(arg.t);
00373 T v2 = sinh(arg.t);
00374 return Rall2d<T,V,S>(v1,v2*arg.d,v2*arg.dd + (v1*arg.d)*arg.d );
00375 }
00376
00377 template <class T,class V,class S>
00378 INLINE Rall2d<T,V,S> tanh(const Rall2d<T,V,S>& arg)
00379 {
00380 T v1 = tanh(arg.t);
00381 T v2 = S(1)-sqr(v1);
00382 return Rall2d<T,V,S>(v1,v2*arg.d, v2*(arg.dd-(S(2)*v1*sqr(arg.d))));
00383 }
00384
00385 template <class T,class V,class S>
00386 INLINE Rall2d<T,V,S> sqr(const Rall2d<T,V,S>& arg)
00387 {
00388 return Rall2d<T,V,S>(arg.t*arg.t,
00389 (S(2)*arg.t)*arg.d,
00390 S(2)*(sqr(arg.d)+arg.t*arg.dd)
00391 );
00392 }
00393
00394 template <class T,class V,class S>
00395 INLINE Rall2d<T,V,S> pow(const Rall2d<T,V,S>& arg,double m)
00396 {
00397 Rall2d<T,V,S> tmp;
00398 tmp.t = pow(arg.t,m);
00399 T v2 = (m/arg.t)*tmp.t;
00400 tmp.d = v2*arg.d;
00401 tmp.dd = (S((m-1))/arg.t)*tmp.d*arg.d + v2*arg.dd;
00402 return tmp;
00403 }
00404
00405 template <class T,class V,class S>
00406 INLINE Rall2d<T,V,S> sqrt(const Rall2d<T,V,S>& arg)
00407 {
00408
00409 Rall2d<T,V,S> tmp;
00410 tmp.t = sqrt(arg.t);
00411 tmp.d = (S(0.5)/tmp.t)*arg.d;
00412 tmp.dd = (S(0.5)*arg.dd-sqr(tmp.d))/tmp.t;
00413 return tmp;
00414 }
00415
00416 template <class T,class V,class S>
00417 INLINE Rall2d<T,V,S> asin(const Rall2d<T,V,S>& arg)
00418 {
00419
00420 Rall2d<T,V,S> tmp;
00421 tmp.t = asin(arg.t);
00422 T v = cos(tmp.t);
00423 tmp.d = arg.d/v;
00424 tmp.dd = (arg.dd+arg.t*sqr(tmp.d))/v;
00425 return tmp;
00426 }
00427
00428 template <class T,class V,class S>
00429 INLINE Rall2d<T,V,S> acos(const Rall2d<T,V,S>& arg)
00430 {
00431
00432 Rall2d<T,V,S> tmp;
00433 tmp.t = acos(arg.t);
00434 T v = -sin(tmp.t);
00435 tmp.d = arg.d/v;
00436 tmp.dd = (arg.dd+arg.t*sqr(tmp.d))/v;
00437 return tmp;
00438
00439 }
00440
00441 template <class T,class V,class S>
00442 INLINE Rall2d<T,V,S> atan(const Rall2d<T,V,S>& x)
00443 {
00444
00445 Rall2d<T,V,S> tmp;
00446 tmp.t = atan(x.t);
00447 T v = S(1)+sqr(x.t);
00448 tmp.d = x.d/v;
00449 tmp.dd = x.dd/v-(S(2)*x.t)*sqr(tmp.d);
00450 return tmp;
00451 }
00452
00453 template <class T,class V,class S>
00454 INLINE Rall2d<T,V,S> atan2(const Rall2d<T,V,S>& y,const Rall2d<T,V,S>& x)
00455 {
00456 Rall2d<T,V,S> tmp;
00457 tmp.t = atan2(y.t,x.t);
00458 T v = sqr(y.t)+sqr(x.t);
00459 tmp.d = (x.t*y.d-x.d*y.t)/v;
00460 tmp.dd = ( x.t*y.dd-x.dd*y.t-S(2)*(x.t*x.d+y.t*y.d)*tmp.d ) / v;
00461 return tmp;
00462 }
00463
00464 template <class T,class V,class S>
00465 INLINE Rall2d<T,V,S> abs(const Rall2d<T,V,S>& x)
00466 {
00467 T v(Sign(x));
00468 return Rall2d<T,V,S>(v*x,v*x.d,v*x.dd);
00469 }
00470
00471 template <class T,class V,class S>
00472 INLINE Rall2d<T,V,S> hypot(const Rall2d<T,V,S>& y,const Rall2d<T,V,S>& x)
00473 {
00474 Rall2d<T,V,S> tmp;
00475 tmp.t = hypot(y.t,x.t);
00476 tmp.d = (x.t*x.d+y.t*y.d)/tmp.t;
00477 tmp.dd = (sqr(x.d)+x.t*x.dd+sqr(y.d)+y.t*y.dd-sqr(tmp.d))/tmp.t;
00478 return tmp;
00479 }
00480
00481
00482 template <class T,class V,class S>
00483 INLINE S Norm(const Rall2d<T,V,S>& value)
00484 {
00485 return Norm(value.t);
00486 }
00487
00488
00489
00490
00491 template <class T,class V,class S>
00492 INLINE Rall2d<T,V,S> LinComb(S alfa,const Rall2d<T,V,S>& a,
00493 const T& beta,const Rall2d<T,V,S>& b ) {
00494 return Rall2d<T,V,S>(
00495 LinComb(alfa,a.t,beta,b.t),
00496 LinComb(alfa,a.d,beta,b.d),
00497 LinComb(alfa,a.dd,beta,b.dd)
00498 );
00499 }
00500
00501 template <class T,class V,class S>
00502 INLINE void LinCombR(S alfa,const Rall2d<T,V,S>& a,
00503 const T& beta,const Rall2d<T,V,S>& b,Rall2d<T,V,S>& result ) {
00504 LinCombR(alfa, a.t, beta, b.t, result.t);
00505 LinCombR(alfa, a.d, beta, b.d, result.d);
00506 LinCombR(alfa, a.dd, beta, b.dd, result.dd);
00507 }
00508
00509 template <class T,class V,class S>
00510 INLINE void SetToZero(Rall2d<T,V,S>& value)
00511 {
00512 SetToZero(value.t);
00513 SetToZero(value.d);
00514 SetToZero(value.dd);
00515 }
00516
00517 template <class T,class V,class S>
00518 INLINE void SetToIdentity(Rall2d<T,V,S>& value)
00519 {
00520 SetToZero(value.d);
00521 SetToIdentity(value.t);
00522 SetToZero(value.dd);
00523 }
00524
00525 template <class T,class V,class S>
00526 INLINE bool Equal(const Rall2d<T,V,S>& y,const Rall2d<T,V,S>& x,double eps=epsilon)
00527 {
00528 return (Equal(x.t,y.t,eps)&&
00529 Equal(x.d,y.d,eps)&&
00530 Equal(x.dd,y.dd,eps)
00531 );
00532 }
00533
00534
00535 }
00536
00537
00538 #endif