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
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
00156
00157
00158
00159
00160
00161
00171 template <size_t row, size_t column>
00172 double
00173 value() const;
00174
00185
00186
00187
00188
00189
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 };
00231
00232
00233
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
00269
00286 Transform3DTo2D
00287 operator*(const Transform3DTo2D& transform0, const Transform3D& transform1);
00288
00289
00290 }
00291
00292 };
00293
00294
00295
00296
00297 namespace dlr {
00298
00299 using numeric::Transform3DTo2D;
00300 using numeric::Transform3DTo2DFunctor;
00301
00302 }
00303
00304
00305
00306
00307
00308
00309
00310 namespace dlr {
00311
00312 namespace numeric {
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372 template <size_t ROW, size_t COLUMN>
00373 double
00374 Transform3DTo2D::
00375 value() const
00376 {
00377
00378
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;
00415 }
00416
00417 }
00418
00419 }
00420
00421 #endif // #ifndef _DLR_TRANSFORM3DTO2D_H_