transform3DTo2D.h

Go to the documentation of this file.
00001 
00015 #ifndef _DLR_TRANSFORM3DTO2D_H_
00016 #define _DLR_TRANSFORM3DTO2D_H_
00017 
00018 #include <dlrNumeric/array2D.h>
00019 #include <dlrNumeric/transform3D.h>
00020 #include <dlrNumeric/vector2D.h>
00021 #include <dlrNumeric/vector3D.h>
00022 
00023 namespace dlr {
00024 
00025   namespace numeric {
00026     
00027     // Forward declaration.
00028     class Transform3DTo2DFunctor;
00029 
00030 
00036     class Transform3DTo2D {
00037     public:
00041       Transform3DTo2D()
00042         : m_00(1.0), m_01(0.0), m_02(0.0), m_03(0.0),
00043           m_10(0.0), m_11(1.0), m_12(0.0), m_13(0.0),
00044           m_20(0.0), m_21(0.0), m_22(1.0), m_23(1.0)
00045         {}
00046 
00067       inline
00068       Transform3DTo2D(double a00, double a01, double a02, double a03,
00069                       double a10, double a11, double a12, double a13,
00070                       double a20, double a21, double a22, double a23)
00071         : m_00(a00), m_01(a01), m_02(a02), m_03(a03),
00072           m_10(a10), m_11(a11), m_12(a12), m_13(a13),
00073           m_20(a20), m_21(a21), m_22(a22), m_23(a23) {
00074       }
00075 
00082       Transform3DTo2D(const Array2D<double>& source);
00083 
00089       inline
00090       Transform3DTo2D(const Transform3DTo2D& src)
00091         : m_00(src.m_00), m_01(src.m_01), m_02(src.m_02), m_03(src.m_03),
00092           m_10(src.m_10), m_11(src.m_11), m_12(src.m_12), m_13(src.m_13),
00093           m_20(src.m_20), m_21(src.m_21), m_22(src.m_22), m_23(src.m_23) {
00094       }
00095 
00099       ~Transform3DTo2D() {}
00100 
00101 
00117       Transform3DTo2DFunctor
00118       getFunctor() const;
00119     
00120     
00141       void
00142       setTransform(double a00, double a01, double a02, double a03,
00143                    double a10, double a11, double a12, double a13,
00144                    double a20, double a21, double a22, double a23);
00145 
00155       // John Culbertson argues convincingly that this breaks the
00156       // abstraction, so we remove it for now.
00157       // 
00158       // template <size_t row, size_t column>
00159       // double&
00160       // value();
00161 
00171       template <size_t row, size_t column>
00172       double
00173       value() const;
00174 
00185       // John Culbertson argues convincingly that this breaks the
00186       // abstraction, so we remove it for now.
00187       // 
00188       // double&
00189       // operator()(size_t row, size_t column);
00190 
00201       double
00202       operator()(size_t row, size_t column) const;
00203 
00211       Vector2D
00212       operator*(const Vector3D& vector0) const;
00213 
00220       Transform3DTo2D&
00221       operator=(const Transform3DTo2D& source);
00222 
00223     private:
00224       void normalize(double scaleFactor);
00225 
00226       double m_00, m_01, m_02, m_03;
00227       double m_10, m_11, m_12, m_13;
00228       double m_20, m_21, m_22, m_23;
00229 
00230     }; // class Transform3DTo2D
00231 
00232 
00233     /* ============== Helper classes ============== */
00234 
00235 
00239     class Transform3DTo2DFunctor
00240       : public std::unary_function<Vector3D, Vector2D> {
00241 
00242     public:
00243 
00249       Transform3DTo2DFunctor(const Transform3DTo2D& transform)
00250         : m_transform(transform) {}
00251 
00252     
00260       inline Vector2D
00261       operator()(const Vector3D& vec) const {return m_transform * vec;}
00262     
00263     private:
00264       Transform3DTo2D m_transform;
00265     };
00266   
00267 
00268     /* ================ Non member functions below ================ */
00269 
00286     Transform3DTo2D
00287     operator*(const Transform3DTo2D& transform0, const Transform3D& transform1);
00288 
00289   
00290   } // namespace numeric
00291 
00292 }; // namespace dlr
00293 
00294 
00295 /* ======= Declarations to maintain compatibility with legacy code. ======= */
00296 
00297 namespace dlr {
00298 
00299   using numeric::Transform3DTo2D;
00300   using numeric::Transform3DTo2DFunctor;
00301 
00302 } // namespace dlr
00303 
00304 
00305 /*******************************************************************
00306  * Member function definitions follow.  This would be a .C file
00307  * if it weren't templated.
00308  *******************************************************************/
00309 
00310 namespace dlr {
00311 
00312   namespace numeric {
00313     
00314     // This operator returns one element from the matrix
00315     // representation of the coordinate transform by reference.
00316     // The case statements should optimize away, since row and column
00317     // are both known at compile time.
00318 //   template <size_t ROW, size_t COLUMN>
00319 //   double&
00320 //   Transform3D::
00321 //   value()
00322 //   {
00323 //     switch(ROW) {
00324 //     case 0:
00325 //       switch(COLUMN) {
00326 //       case 0: return m_00; break;
00327 //       case 1: return m_01; break;
00328 //       case 2: return m_02; break;
00329 //       case 3: return m_03; break;
00330 //       default: break;
00331 //       }
00332 //       break;
00333 //     case 1:
00334 //       switch(COLUMN) {
00335 //       case 0: return m_10; break;
00336 //       case 1: return m_11; break;
00337 //       case 2: return m_12; break;
00338 //       case 3: return m_13; break;
00339 //       default: break;
00340 //       }
00341 //       break;
00342 //     case 2:
00343 //       switch(COLUMN) {
00344 //       case 0: return m_20; break;
00345 //       case 1: return m_21; break;
00346 //       case 2: return m_22; break;
00347 //       case 3: return m_23; break;
00348 //       default: break;
00349 //       }
00350 //       break;
00351 //     case 3:
00352 //       switch(COLUMN) {
00353 //       case 0: return m_30; break;
00354 //       case 1: return m_31; break;
00355 //       case 2: return m_32; break;
00356 //       default: break;
00357 //       }
00358 //       break;
00359 //     default:
00360 //       break;
00361 //     }
00362 //     std::ostringstream message;
00363 //     message << "Index (" << ROW << ", " << COLUMN << ") out of bounds.";
00364 //     DLR_THROW(IndexException, message.str().c_str());
00365 //     return m_00; // Dummy return to keep the compiler happy.
00366 //   }
00367 
00368     // This operator returns one element from the matrix
00369     // representation of the coordinate transform by value.
00370     // The case statements should optimize away, since row and column
00371     // are both known at compile time.
00372     template <size_t ROW, size_t COLUMN>
00373     double
00374     Transform3DTo2D::
00375     value() const
00376     {
00377       // // Avoid ugly duplication of code using ugly const_cast.
00378       // return const_cast<Transform3D*>(this)->value<ROW, COLUMN>();
00379       switch(ROW) {
00380       case 0:
00381         switch(COLUMN) {
00382         case 0: return m_00; break;
00383         case 1: return m_01; break;
00384         case 2: return m_02; break;
00385         case 3: return m_03; break;
00386         default: break;
00387         }
00388         break;
00389       case 1:
00390         switch(COLUMN) {
00391         case 0: return m_10; break;
00392         case 1: return m_11; break;
00393         case 2: return m_12; break;
00394         case 3: return m_13; break;
00395         default: break;
00396         }
00397         break;
00398       case 2:
00399         switch(COLUMN) {
00400         case 0: return m_20; break;
00401         case 1: return m_21; break;
00402         case 2: return m_22; break;
00403         case 3: return m_23; break;
00404         default: break;
00405         }
00406         break;
00407       default:
00408         break;
00409       }
00410       std::ostringstream message;
00411       message << "Indices (" << ROW << ", " << COLUMN << ") are out of bounds.";
00412       DLR_THROW(IndexException, "Transform3DTo2D::value<size_t, size_t>()",
00413                 message.str().c_str());
00414       return 0.0; // Dummy return to keep the compiler happy.
00415     }
00416 
00417   } // namespace numeric
00418 
00419 } // namespace dlr
00420 
00421 #endif // #ifndef _DLR_TRANSFORM3DTO2D_H_

Generated on Mon Jul 9 20:34:03 2007 for dlrLibs Utility Libraries by  doxygen 1.5.2