00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef IMPALGEBRA_TRANSFORMATION_2D_H
00011 #define IMPALGEBRA_TRANSFORMATION_2D_H
00012
00013 #include "algebra_config.h"
00014
00015 #include "Vector2D.h"
00016 #include "Matrix2D.h"
00017 #include "Rotation2D.h"
00018
00019 IMPALGEBRA_BEGIN_NAMESPACE
00020
00021 #if !defined(IMP_DOXYGEN) && !defined(SWIG)
00022
00023 class Transformation2D;
00024 Transformation2D compose(const Transformation2D &a,
00025 const Transformation2D &b);
00026 #endif
00027
00028
00029
00030
00031 class IMPALGEBRAEXPORT Transformation2D
00032 {
00033 public:
00034
00035 IMP_NO_DOXYGEN(typedef Transformation2D This);
00036
00037
00038 Transformation2D(){}
00039
00040
00041 Transformation2D(const Rotation2D& r,
00042 const VectorD<2>& t=VectorD<2>(0.0,0.0)):
00043 trans_(t), rot_(r){}
00044
00045
00046 Transformation2D(const VectorD<2>& t):
00047 trans_(t), rot_(get_identity_rotation_2d()){}
00048
00049 ~Transformation2D();
00050
00051
00052
00053
00054
00055
00056
00057 VectorD<2> get_transformed(const VectorD<2> &o) const {
00058 return rot_.get_rotated(o) + trans_;
00059 }
00060
00061
00062
00063
00064
00065
00066 VectorD<2> operator*(const VectorD<2> &v) const {
00067 return get_transformed(v);
00068 }
00069
00070
00071
00072
00073
00074
00075 Transformation2D operator*(const Transformation2D &tr) const {
00076 return compose(*this, tr);
00077 }
00078
00079
00080 const Transformation2D& operator*=(const Transformation2D &o) {
00081 *this=compose(*this, o);
00082 return *this;
00083 }
00084
00085
00086
00087 Transformation2D operator/(const Transformation2D &b) const {
00088 Transformation2D ret= compose(*this, b.get_inverse());
00089 return ret;
00090 }
00091
00092
00093 const Transformation2D& operator/=(const Transformation2D &o) {
00094 *this= *this/o;
00095 return *this;
00096 }
00097
00098
00099 const Rotation2D get_rotation() const {return rot_;}
00100
00101 void set_rotation(double angle) {
00102 rot_.set_angle(angle);
00103 }
00104
00105
00106 const VectorD<2> get_translation()const{return trans_;}
00107
00108
00109 template<typename T1>
00110 void set_translation(T1& v) {
00111 trans_[0]=v[0];
00112 trans_[1]=v[1];
00113 }
00114
00115
00116 void show(std::ostream& out = std::cout) const {
00117 rot_.show(out);
00118 out << " || " << trans_;
00119 }
00120
00121
00122 Transformation2D get_inverse() const;
00123
00124 private:
00125 VectorD<2> trans_;
00126 Rotation2D rot_;
00127 };
00128
00129
00130 IMP_OUTPUT_OPERATOR(Transformation2D);
00131
00132
00133
00134
00135
00136 inline Transformation2D get_identity_transformation_2d() {
00137 return Transformation2D(get_identity_rotation_2d(),VectorD<2>(0.0,0.0));
00138 };
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148 inline Transformation2D get_rotation_about_point(const VectorD<2> &point,
00149 const Rotation2D &rotation) {
00150 return Transformation2D(rotation, (rotation.get_rotated(-point)+point));
00151 };
00152
00153
00154
00155
00156
00157 inline Transformation2D compose(const Transformation2D &a,
00158 const Transformation2D &b){
00159 Rotation2D R= compose(a.get_rotation(),b.get_rotation());
00160 return Transformation2D(R,a.get_transformed(b.get_translation()));
00161 };
00162
00163
00164
00165 IMPALGEBRA_END_NAMESPACE
00166 #endif