testTransformationMatrix.cc
Go to the documentation of this file.
1 
10 #include <utl/TransformationMatrix.h>
11 #include <cmath>
12 
13 #include <tst/Verify.h>
14 #include <utl/Triple.h>
15 
16 #include <cppunit/extensions/HelperMacros.h>
17 
18 using namespace utl;
19 using namespace tst;
20 using utl::Triple;
22 using std::abs;
23 using std::sqrt;
24 
25 
29 class testTransformationMatrix : public CppUnit::TestFixture {
30 
31  CPPUNIT_TEST_SUITE(testTransformationMatrix);
32  CPPUNIT_TEST(testConstructor);
33  CPPUNIT_TEST(testDistance);
34  CPPUNIT_TEST(testTranslation);
35  CPPUNIT_TEST(testRotation);
36  CPPUNIT_TEST(testTransformation);
37  CPPUNIT_TEST(testDreibein);
38  CPPUNIT_TEST_SUITE_END();
39 
40 public:
41  void setUp() { }
42 
43  void tearDown() { }
44 
45  void
47  {
49  [[maybe_unused]] TransformationMatrix IdCopy(Id);
50  }
51 
52  void
54  {
56  CPPUNIT_ASSERT(Id.Distance(Id) == 0);
57  }
58 
59  void
61  {
68  const TransformationMatrix Id;
69 
70  // the next test should be CPPUNIT_ASSERT_CLOSE, but it doesn't compile.
71  CPPUNIT_ASSERT(Verify<CloseTo>(Id.Distance(mX*mXInv), 0.));
72  CPPUNIT_ASSERT(Verify<CloseTo>(Id.Distance(mX*m2XInv*mX), 0.));
73  CPPUNIT_ASSERT(Verify<CloseTo>(Id.Distance(mX*mY*mZ*mXYZInv), 0.));
74  CPPUNIT_ASSERT(Verify<CloseTo>(Id.Distance(mXYZInv.Inverse() * mXYZInv), 0.));
75  }
76 
77  void testRotation()
78  {
79  const TransformationMatrix Id;
84  CPPUNIT_ASSERT(Verify<CloseTo>(RX.Distance(RXInv.Inverse()), 0.));
85  CPPUNIT_ASSERT(Verify<CloseTo>(Id.Distance(RX * RXInv), 0.));
86  CPPUNIT_ASSERT(Verify<CloseTo>(Id.Distance(RXInv * RX), 0.));
87 
88  // should be different
89  CPPUNIT_ASSERT(Verify<Not<CloseTo> >(RX.Distance(RY), 0.));
90  CPPUNIT_ASSERT(Verify<Not<CloseTo> >(RX.Distance(RZ), 0.));
91  CPPUNIT_ASSERT(Verify<Not<CloseTo> >(RY.Distance(RZ), 0.));
92 
93  const TransformationMatrix R(TransformationMatrix::Rotation(0.123, 1.1, 2.2, 3.3));
94  const TransformationMatrix RInv(TransformationMatrix::Rotation(-0.123, 1.1, 2.2, 3.3));
95  const TransformationMatrix R1(TransformationMatrix::Rotation(0.123, Triple(1.1, 2.2, 3.3)));
96  CPPUNIT_ASSERT(Verify<CloseTo>(R.Distance(R1), 0.));
97  CPPUNIT_ASSERT(Verify<CloseTo>(RInv.Distance(R1.Inverse()), 0.));
98  CPPUNIT_ASSERT(Verify<CloseTo>(Id.Distance(RInv * R), 0.));
99 
100  CPPUNIT_ASSERT(Verify<CloseTo>(Id.Distance(RX*RInv * R*RXInv), 0.));
101 
102  const TransformationMatrix M(RX*RInv);
103  const TransformationMatrix MInv(M.Inverse());
104  CPPUNIT_ASSERT(Verify<CloseTo>(Id.Distance(MInv * M), 0.));
105 
106  }
107 
109  {
110  const TransformationMatrix Id;
111 
114  const TransformationMatrix TXYZInv(TransformationMatrix::Translation(-1, -1, -1));
116 
117  const TransformationMatrix R(TransformationMatrix::Rotation(0.123, 1.1, 2.2, 3.3));
118  const TransformationMatrix RInv(TransformationMatrix::Rotation(-0.123, 1.1, 2.2, 3.3));
119 
120  const TransformationMatrix RT(R*TXYZ);
121  const TransformationMatrix RTInv(TXYZInv*RInv);
122  CPPUNIT_ASSERT(Verify<CloseTo>(Id.Distance(RInv*TX*TXInv*R), 0.));
123  CPPUNIT_ASSERT(Verify<CloseTo>(Id.Distance(RT * RTInv), 0.));
124  }
125 
127  {
128  const TransformationMatrix db1 =
130  0, 1/sqrt(2.), -1/sqrt(2.),
131  0, 1/sqrt(2.), 1/sqrt(2.));
133  CPPUNIT_ASSERT(Verify<CloseTo>(rx.Distance(db1), 0.));
134 
135  const TransformationMatrix db2 =
137  0, 1, 0,
138  -1/sqrt(2.), 0, 1/sqrt(2.));
140  CPPUNIT_ASSERT(Verify<CloseTo>(ry.Distance(db2), 0.));
141 
142  const TransformationMatrix db3 =
144  1/sqrt(2.), 1/sqrt(2.), 0,
145  0, 0, 1);
147  CPPUNIT_ASSERT(Verify<CloseTo>(rz.Distance(db3), 0.));
148  }
149 
150 };
151 
152 
154 
155 
156 // Configure (x)emacs for this file ...
157 // Local Variables:
158 // mode:c++
159 // compile-command: "make -C .. -k run-testGeometry"
160 // End:
static TransformationMatrix TransformToBasis(const double x1, const double y1, const double z1, const double x2, const double y2, const double z2, const double x3, const double y3, const double z3)
From dreibein (basis vectors)
static TransformationMatrix RotationX(const double angle)
Rotation by angle about X axis.
CPPUNIT_TEST_SUITE_REGISTRATION(testAiresShowerFile)
static TransformationMatrix Rotation(const double angle, const double x, const double y, const double z)
Rotation by angle about axis given by three components.
Definition: Test.h:180
Transformations matrices for afine transformations.
boost::tuple< double, double, double > Triple
Coordinate triple for easy getting or setting of coordinates.
Definition: Triple.h:15
double Distance(const TransformationMatrix &second) const
Distance between transformations (useful for testing)
bool Verify(const Predicate &pred, const T &lhs, const T &rhs)
Test condition by evaluating a predicate and print on failure.
Definition: Verify.h:38
double abs(const SVector< n, T > &v)
static TransformationMatrix Translation(const double x, const double y, const double z)
Translation.
TransformationMatrix Inverse() const
Inverse transformation.
static TransformationMatrix RotationZ(const double angle)
Rotation by angle about Z axis.
static TransformationMatrix RotationY(const double angle)
Rotation by angle about Y axis.

, generated on Tue Sep 26 2023.