Engauge Digitizer  2
TestTransformation.cpp
1 #include "DocumentModelCoords.h"
2 #include "Logger.h"
3 #include "MainWindow.h"
4 #include <qmath.h>
5 #include <QtTest/QtTest>
6 #include "Test/TestTransformation.h"
7 #include "Transformation.h"
8 
9 QTEST_MAIN (TestTransformation)
10 
11 const double EPSILON = 1.0;
12 
13 using namespace std;
14 
16  QObject(parent)
17 {
18 }
19 
20 void TestTransformation::cleanupTestCase ()
21 {
22 
23 }
24 
25 double TestTransformation::differenceMagnitude (const QPointF &vector1,
26  const QPointF &vector2) const
27 {
28  QPointF difference = vector1 - vector2;
29  return qSqrt (difference.x() * difference.x() +
30  difference.y() * difference.y());
31 }
32 void TestTransformation::initTestCase ()
33 {
34  const QString NO_ERROR_REPORT_LOG_FILE;
35  const bool NO_GNUPLOT_LOG_FILES = false;
36  const bool DEBUG_FLAG = false;
37  initializeLogging ("engauge_test",
38  "engauge_test.log",
39  DEBUG_FLAG);
40 
41  MainWindow w (NO_ERROR_REPORT_LOG_FILE,
42  NO_GNUPLOT_LOG_FILES);
43  w.show ();
44 }
45 
46 void TestTransformation::initTransformation (const QPointF &s0,
47  const QPointF &s1,
48  const QPointF &s2,
49  const QPointF &g0,
50  const QPointF &g1,
51  const QPointF &g2,
52  const DocumentModelCoords &modelCoords)
53 {
54  QTransform matrixScreen (s0.x(), s1.x(), s2.x(),
55  s0.y(), s1.y(), s2.y(),
56  1.0, 1.0, 1.0);
57  QTransform matrixGraph (g0.x(), g1.x(), g2.x(),
58  g0.y(), g1.y(), g2.y(),
59  1.0, 1.0, 1.0);
60 
62  t.setModelCoords (modelCoords);
63  t.updateTransformFromMatrices(matrixScreen,
64  matrixGraph);
65 
67  m_g0Transformed);
69  m_g1Transformed);
71  m_g2Transformed);
73  m_s0Transformed);
75  m_s1Transformed);
77  m_s2Transformed);
78 }
79 
80 DocumentModelCoords TestTransformation::modelCoordsDefault() const
81 {
82  DocumentModelCoords modelCoords;
83 
84  modelCoords.setCoordScaleXTheta (COORD_SCALE_LINEAR);
85  modelCoords.setCoordScaleYRadius (COORD_SCALE_LINEAR);
86  modelCoords.setCoordsType (COORDS_TYPE_CARTESIAN);
87  modelCoords.setCoordUnitsDate(COORD_UNITS_DATE_YEAR_MONTH_DAY);
88  modelCoords.setCoordUnitsRadius (COORD_UNITS_NON_POLAR_THETA_NUMBER);
89  modelCoords.setCoordUnitsTheta (COORD_UNITS_POLAR_THETA_DEGREES);
90  modelCoords.setCoordUnitsTime (COORD_UNITS_TIME_HOUR_MINUTE_SECOND);
91  modelCoords.setCoordUnitsX (COORD_UNITS_NON_POLAR_THETA_NUMBER);
92  modelCoords.setCoordUnitsY (COORD_UNITS_NON_POLAR_THETA_NUMBER);
93  modelCoords.setOriginRadius (0.0);
94 
95  return modelCoords;
96 }
97 void TestTransformation::testCartesianLinearLinear ()
98 {
99  QPointF s0 (10, 1000);
100  QPointF s1 (1000, 1000);
101  QPointF s2 (10, 10);
102  QPointF g0 (1, 1);
103  QPointF g1 (10, 1);
104  QPointF g2 (1, 10);
105 
106  initTransformation (s0,
107  s1,
108  s2,
109  g0,
110  g1,
111  g2,
112  modelCoordsDefault());
113 
114  QVERIFY (differenceMagnitude (s0, m_s0Transformed) < EPSILON);
115  QVERIFY (differenceMagnitude (s1, m_s1Transformed) < EPSILON);
116  QVERIFY (differenceMagnitude (s2, m_s2Transformed) < EPSILON);
117  QVERIFY (differenceMagnitude (g0, m_g0Transformed) < EPSILON);
118  QVERIFY (differenceMagnitude (g1, m_g1Transformed) < EPSILON);
119  QVERIFY (differenceMagnitude (g2, m_g2Transformed) < EPSILON);
120 }
121 
122 void TestTransformation::testCartesianLinearLog ()
123 {
124  QPointF s0 (10, 1000);
125  QPointF s1 (1000, 1000);
126  QPointF s2 (10, 10);
127  QPointF g0 (1, 1);
128  QPointF g1 (10, 1);
129  QPointF g2 (1, 10);
130 
131  DocumentModelCoords modelCoords = modelCoordsDefault();
132  modelCoords.setCoordScaleYRadius (COORD_SCALE_LOG);
133  initTransformation (s0,
134  s1,
135  s2,
136  g0,
137  g1,
138  g2,
139  modelCoordsDefault());
140 
141  QVERIFY (differenceMagnitude (s0, m_s0Transformed) < EPSILON);
142  QVERIFY (differenceMagnitude (s1, m_s1Transformed) < EPSILON);
143  QVERIFY (differenceMagnitude (s2, m_s2Transformed) < EPSILON);
144  QVERIFY (differenceMagnitude (g0, m_g0Transformed) < EPSILON);
145  QVERIFY (differenceMagnitude (g1, m_g1Transformed) < EPSILON);
146  QVERIFY (differenceMagnitude (g2, m_g2Transformed) < EPSILON);
147 }
148 
149 void TestTransformation::testCartesianLogLinear ()
150 {
151  QPointF s0 (10, 1000);
152  QPointF s1 (1000, 1000);
153  QPointF s2 (10, 10);
154  QPointF g0 (1, 1);
155  QPointF g1 (10, 1);
156  QPointF g2 (1, 10);
157 
158  DocumentModelCoords modelCoords = modelCoordsDefault();
159  modelCoords.setCoordScaleXTheta (COORD_SCALE_LOG);
160  initTransformation (s0,
161  s1,
162  s2,
163  g0,
164  g1,
165  g2,
166  modelCoordsDefault());
167 
168  QVERIFY (differenceMagnitude (s0, m_s0Transformed) < EPSILON);
169  QVERIFY (differenceMagnitude (s1, m_s1Transformed) < EPSILON);
170  QVERIFY (differenceMagnitude (s2, m_s2Transformed) < EPSILON);
171  QVERIFY (differenceMagnitude (g0, m_g0Transformed) < EPSILON);
172  QVERIFY (differenceMagnitude (g1, m_g1Transformed) < EPSILON);
173  QVERIFY (differenceMagnitude (g2, m_g2Transformed) < EPSILON);
174 }
175 
176 void TestTransformation::testCartesianLogLog ()
177 {
178  QPointF s0 (10, 1000);
179  QPointF s1 (1000, 1000);
180  QPointF s2 (10, 10);
181  QPointF g0 (1, 1);
182  QPointF g1 (10, 1);
183  QPointF g2 (1, 10);
184 
185  DocumentModelCoords modelCoords = modelCoordsDefault();
186  modelCoords.setCoordScaleXTheta (COORD_SCALE_LOG);
187  modelCoords.setCoordScaleYRadius (COORD_SCALE_LOG);
188  initTransformation (s0,
189  s1,
190  s2,
191  g0,
192  g1,
193  g2,
194  modelCoordsDefault());
195 
196  QVERIFY (differenceMagnitude (s0, m_s0Transformed) < EPSILON);
197  QVERIFY (differenceMagnitude (s1, m_s1Transformed) < EPSILON);
198  QVERIFY (differenceMagnitude (s2, m_s2Transformed) < EPSILON);
199  QVERIFY (differenceMagnitude (g0, m_g0Transformed) < EPSILON);
200  QVERIFY (differenceMagnitude (g1, m_g1Transformed) < EPSILON);
201  QVERIFY (differenceMagnitude (g2, m_g2Transformed) < EPSILON);
202 }
203 
204 void TestTransformation::testPolarLinear ()
205 {
206  QPointF s0 (500, 1000);
207  QPointF s1 (1000, 500);
208  QPointF s2 (500, 500); // Origin at center
209  QPointF g0 (-90, 100);
210  QPointF g1 (0, 100);
211  QPointF g2 (0, 0);
212 
213  DocumentModelCoords modelCoords = modelCoordsDefault();
214  modelCoords.setCoordsType (COORDS_TYPE_POLAR);
215  initTransformation (s0,
216  s1,
217  s2,
218  g0,
219  g1,
220  g2,
221  modelCoordsDefault());
222 
223  QVERIFY (differenceMagnitude (s0, m_s0Transformed) < EPSILON);
224  QVERIFY (differenceMagnitude (s1, m_s1Transformed) < EPSILON);
225  QVERIFY (differenceMagnitude (s2, m_s2Transformed) < EPSILON);
226  QVERIFY (differenceMagnitude (g0, m_g0Transformed) < EPSILON);
227  QVERIFY (differenceMagnitude (g1, m_g1Transformed) < EPSILON);
228  QVERIFY (differenceMagnitude (g2, m_g2Transformed) < EPSILON);
229 }
230 
231 void TestTransformation::testPolarLogOffset1 ()
232 {
233  QPointF s0 (500, 1000);
234  QPointF s1 (1000, 500);
235  QPointF s2 (500, 500); // Origin at center
236  QPointF g0 (-90, 100);
237  QPointF g1 (0, 100);
238  QPointF g2 (0, 1);
239 
240  DocumentModelCoords modelCoords = modelCoordsDefault();
241  modelCoords.setCoordsType (COORDS_TYPE_POLAR);
242  modelCoords.setCoordScaleYRadius (COORD_SCALE_LOG);
243  modelCoords.setOriginRadius (1.0);
244  initTransformation (s0,
245  s1,
246  s2,
247  g0,
248  g1,
249  g2,
250  modelCoordsDefault());
251 
252  QVERIFY (differenceMagnitude (s0, m_s0Transformed) < EPSILON);
253  QVERIFY (differenceMagnitude (s1, m_s1Transformed) < EPSILON);
254  QVERIFY (differenceMagnitude (s2, m_s2Transformed) < EPSILON);
255  QVERIFY (differenceMagnitude (g0, m_g0Transformed) < EPSILON);
256  QVERIFY (differenceMagnitude (g1, m_g1Transformed) < EPSILON);
257  QVERIFY (differenceMagnitude (g2, m_g2Transformed) < EPSILON);
258 }
259 
260 void TestTransformation::testPolarLogOffset10 ()
261 {
262  QPointF s0 (500, 1000);
263  QPointF s1 (1000, 500);
264  QPointF s2 (500, 500); // Origin at center
265  QPointF g0 (-90, 100);
266  QPointF g1 (0, 100);
267  QPointF g2 (0, 10);
268 
269  DocumentModelCoords modelCoords = modelCoordsDefault();
270  modelCoords.setCoordsType (COORDS_TYPE_POLAR);
271  modelCoords.setCoordScaleYRadius (COORD_SCALE_LOG);
272  modelCoords.setOriginRadius (10.0);
273  initTransformation (s0,
274  s1,
275  s2,
276  g0,
277  g1,
278  g2,
279  modelCoordsDefault());
280 
281  QVERIFY (differenceMagnitude (s0, m_s0Transformed) < EPSILON);
282  QVERIFY (differenceMagnitude (s1, m_s1Transformed) < EPSILON);
283  QVERIFY (differenceMagnitude (s2, m_s2Transformed) < EPSILON);
284  QVERIFY (differenceMagnitude (g0, m_g0Transformed) < EPSILON);
285  QVERIFY (differenceMagnitude (g1, m_g1Transformed) < EPSILON);
286  QVERIFY (differenceMagnitude (g2, m_g2Transformed) < EPSILON);
287 }
void transformScreenToRawGraph(const QPointF &coordScreen, QPointF &coordGraph) const
Transform from cartesian pixel screen coordinates to cartesian/polar graph coordinates.
void setCoordUnitsTime(CoordUnitsTime coordUnits)
Set method for time units.
void setCoordUnitsDate(CoordUnitsDate coordUnits)
Set method for date units.
void setCoordUnitsY(CoordUnitsNonPolarTheta coordUnits)
Set method for y units.
void setCoordUnitsX(CoordUnitsNonPolarTheta coordUnits)
Set method for x units.
void setCoordScaleYRadius(CoordScale coordScale)
Set method for linear/log scale on y/radius.
Unit test of transformation class. Checking mostly involves verifying forward/reverse are inverses of...
Affine transformation between screen and graph coordinates, based on digitized axis points...
void setCoordUnitsTheta(CoordUnitsPolarTheta coordUnits)
Set method for theta units.
Model for DlgSettingsCoords and CmdSettingsCoords.
void setOriginRadius(double originRadius)
Set method for origin radius in polar mode.
void setCoordUnitsRadius(CoordUnitsNonPolarTheta coordUnits)
Set method for radius units.
void transformRawGraphToScreen(const QPointF &pointRaw, QPointF &pointScreen) const
Transform from raw graph coordinates to linear cartesian graph coordinates, then to screen coordinate...
Main window consisting of menu, graphics scene, status bar and optional toolbars as a Single Document...
Definition: MainWindow.h:60
void setCoordScaleXTheta(CoordScale coordScale)
Set method for linear/log scale on x/theta.
void setCoordsType(CoordsType coordsType)
Set method for coordinates type.