00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef RTC_TRANSFORM2D_H
00020 #define RTC_TRANSFORM2D_H
00021
00022
00023 #include "rtc/rtcMath.h"
00024 #include "rtc/rtcTransform2D.h"
00025 #include "rtc/rtcRotation2D.h"
00026 #include "rtc/rtcVec.h"
00027 #include "rtc/rtcVec2.h"
00028 #include "rtc/rtcVec3.h"
00029 #include "rtc/rtcSMat3.h"
00030
00031
00032 namespace rtc {
00033
00034
00035 template <class T> class Transform2D;
00036 template <class T> class Rotation2D;
00037 template <class T, int M> class Vec;
00038 template <class T> class Vec2;
00039
00046 template <class T>
00047 class Transform2D: public SMat3<T> {
00048 public:
00049
00050 Transform2D();
00051 Transform2D(const Mat<T,3,3>& m);
00052 Transform2D(const SMat3<T>& m);
00053 Transform2D(const Rotation2D<T>& rot);
00054 Transform2D(const Vec2<T>& trans);
00055 Transform2D(const Rotation2D<T>& rot, const Vec2<T>& trans);
00056 Transform2D(const T& dtheta, const T& dx, const T& dy);
00057
00058
00059 void get( Rotation2D<T>& rot, Vec2<T>& trans) const;
00060 void get(T& theta, T& dx, T& dy) const;
00061 Vec2<T> getTrans( ) const;
00062 void getTrans(T& dx, T& dy) const;
00063 Rotation2D<T> getRot( ) const;
00064 void getRot(T& dtheta) const;
00065
00066
00067 void set(const Rotation2D<T>& rot);
00068 void set(const Vec2<T>& trans);
00069 void set(const Rotation2D<T>& rot, const Vec2<T>& trans);
00070 void set(const T& dtheta, const T& dx, const T& dy);
00071 void rotate(T theta);
00072 void translate(T x, T y);
00073 void translate(const Vec2<T>& t);
00074
00075
00076 Vec<T,3> operator * (const Vec2<T>& v) const;
00077 void apply(Vec2<T>& v) const;
00078 Vec2<T> apply(const Vec2<T>& v) const;
00079
00080
00081 Transform2D<T> inverted() const;
00082 Transform2D<T> relativeTo(const Transform2D<T>& referenceFrame) const;
00083
00084
00085 using SMat<T,3>::set;
00086 using SMat<T,3>::x;
00087 #ifndef WIN32
00088 using SMat<T,3>::operator*;
00089 #endif
00090 };
00091
00092
00093 typedef Transform2D<float> Transform2Df;
00094 typedef Transform2D<double> Transform2Dd;
00095
00096
00097
00098
00099
00102 template <class T>
00103 inline Transform2D<T>::Transform2D() {
00104 set(Rotation2D<T>(),Vec<T,2>(T(0)));
00105 }
00106
00109 template <class T>
00110 inline Transform2D<T>::Transform2D(const Rotation2D<T>& r){
00111 set(r,Vec2<T>(T(0)));
00112 }
00113
00116 template <class T>
00117 inline Transform2D<T>::Transform2D(const Vec2<T>& t){
00118 set(Rotation2D<T>(),t);
00119 }
00120
00123 template <class T>
00124 inline Transform2D<T>::Transform2D(const Rotation2D<T>& rot, const Vec2<T>& trans){
00125 set(rot,trans);
00126 }
00127
00130 template <class T>
00131 inline Transform2D<T>::Transform2D(const SMat3<T>& m) : SMat3<T>(m) {}
00132
00135 template <class T>
00136 inline Transform2D<T>::Transform2D(const T& dtheta, const T& dx, const T& dy){
00137 set(dtheta,dx,dy);
00138 }
00139
00142 template <class T>
00143 inline Transform2D<T>::Transform2D(const Mat<T,3,3>& m) : SMat3<T>(m) {}
00144
00145
00146
00149 template <class T>
00150 inline void Transform2D<T>::get(Rotation2D<T>& r, Vec2<T>& t) const
00151 {
00152 r=Rotation2D<T>(x[0],x[1],
00153 x[3],x[4]);
00154 t=Vec2<T>(x[2],x[5]);
00155 }
00156
00159 template <class T>
00160 inline void Transform2D<T>::get(T& theta, T& dx, T& dy) const
00161 {
00162 getTrans(dx,dy);
00163 getRot(theta);
00164 }
00165
00168 template <class T>
00169 inline Vec2<T> Transform2D<T>::getTrans() const
00170 {
00171 return Vec2<T>(x[2],x[5]);
00172 }
00173
00176 template <class T>
00177 inline void Transform2D<T>::getTrans(T& dx, T& dy) const
00178 {
00179 dx=x[2];
00180 dy=x[5];
00181 }
00182
00185 template <class T>
00186 inline Rotation2D<T> Transform2D<T>::getRot() const
00187 {
00188 return Rotation2D<T>(x[0],x[1],
00189 x[3],x[4]);
00190 }
00191
00194 template <class T>
00195 inline void Transform2D<T>::getRot(T& dtheta) const
00196 {
00197 dtheta = atan2(x[3],x[0]);
00198 }
00199
00200
00201
00204 template <class T>
00205 inline void Transform2D<T>::set(const Rotation2D<T>& r) {
00206 for (int i=0;i<2;i++)
00207 for (int j=0;j<2;j++)
00208 (*this)(i,j) = r(i,j);
00209 x[6] = 0; x[7] = 0; x[8] = 1;
00210 }
00211
00214 template <class T>
00215 inline void Transform2D<T>::set(const Vec2<T>& t) {
00216 x[2] = t(0);
00217 x[5] = t(1);
00218 x[6] = 0; x[7] = 0; x[8] = 1;
00219 }
00220
00223 template <class T>
00224 inline void Transform2D<T>::set(const Rotation2D<T>& r, const Vec2<T>& t) {
00225 set(r);
00226 set(t);
00227 }
00228
00231 template <class T>
00232 inline void Transform2D<T>::set(const T& dtheta, const T& dx, const T& dy) {
00233 set(Rotation2D<T>(dtheta),Vec2<T>(dx,dy));
00234 }
00235
00238 template <class T>
00239 inline void Transform2D<T>::rotate(T theta)
00240 {
00241 Transform2D<T> temp;
00242 T ctheta = cos(theta), stheta = sin(theta);
00243 temp(0,0) = ctheta;
00244 temp(0,1) = -stheta;
00245 temp(1,0) = stheta;
00246 temp(1,1) = ctheta;
00247 leftMultiply(temp);
00248 }
00249
00252 template <class T>
00253 inline void Transform2D<T>::translate(T _x, T _y)
00254 {
00255 x[2] += _x;
00256 x[5] += _y;
00257 }
00258
00261 template <class T>
00262 inline void Transform2D<T>::translate(const Vec2<T>& t)
00263 {
00264 translate(t[0],t[1]);
00265 }
00266
00269 template <class T>
00270 inline Vec<T,3> Transform2D<T>::operator * (const Vec2<T>& v) const {
00271 return (*(Mat<T,3,3>*)this)*Vec3<T>(v(0),v(1),T(1.0));
00272 }
00273
00276 template <class T>
00277 inline void Transform2D<T>::apply(Vec2<T>& v) const {
00278 Vec<T,3> v1 = (*this)*v;
00279 v.set(v1[0],v1[1]);
00280 }
00281
00284 template <class T>
00285 inline Vec2<T> Transform2D<T>::apply(const Vec2<T>& v) const {
00286 Vec<T,3> v1 = (*this)*v;
00287 return(Vec2<T>(v1[0],v1[1]));
00288 }
00289
00297 template <class T>
00298 inline Transform2D<T> Transform2D<T>::inverted() const{
00299 Rotation2D<T> r(x[0],x[3],
00300 x[1],x[4]);
00301 Vec2<T> t(-x[2],-x[5]);
00302 return Transform2D<T>(r,r*t);
00303 }
00304
00308 template <class T>
00309 inline Transform2D<T> Transform2D<T>::relativeTo(const Transform2D<T>& referenceFrame) const {
00310 return SMat3<T>(referenceFrame.inverted()*(*this));
00311 }
00312
00313
00314 }
00315
00316 #endif // RTC_TRANSFORM2D_H
00317
00318