Engauge Digitizer  2
 All Classes Files Functions Variables Enumerations Enumerator Friends Pages
TestTransformation.cpp
1 #include "DocumentModelCoords.h"
2 #include "Logger.h"
3 #include "MainWindow.h"
4 #include "MainWindowModel.h"
5 #include <qmath.h>
6 #include <QtTest/QtTest>
7 #include "Test/TestTransformation.h"
8 #include "Transformation.h"
9 
10 QTEST_MAIN (TestTransformation)
11 
12 const double EPSILON = 1.0;
13 
14 using namespace std;
15 
17  QObject(parent)
18 {
19 }
20 
21 void TestTransformation::cleanupTestCase ()
22 {
23 
24 }
25 
26 double TestTransformation::differenceMagnitude (const QPointF &vector1,
27  const QPointF &vector2) const
28 {
29  QPointF difference = vector1 - vector2;
30  return qSqrt (difference.x() * difference.x() +
31  difference.y() * difference.y());
32 }
33 void TestTransformation::initTestCase ()
34 {
35  const QString NO_ERROR_REPORT_LOG_FILE;
36  const QString NO_REGRESSION_OPEN_FILE;
37  const bool NO_GNUPLOT_LOG_FILES = false;
38  const bool NO_REGRESSION_IMPORT = false;
39  const bool NO_RESET = false;
40  const bool DEBUG_FLAG = false;
41  const QStringList NO_LOAD_STARTUP_FILES;
42 
43  initializeLogging ("engauge_test",
44  "engauge_test.log",
45  DEBUG_FLAG);
46 
47  MainWindow w (NO_ERROR_REPORT_LOG_FILE,
48  NO_REGRESSION_OPEN_FILE,
49  NO_GNUPLOT_LOG_FILES,
50  NO_REGRESSION_IMPORT,
51  NO_RESET,
52  NO_LOAD_STARTUP_FILES);
53  w.show ();
54 }
55 
56 void TestTransformation::initTransformation (const QPointF &s0,
57  const QPointF &s1,
58  const QPointF &s2,
59  const QPointF &g0,
60  const QPointF &g1,
61  const QPointF &g2,
62  const DocumentModelCoords &modelCoords)
63 {
64  QTransform matrixScreen (s0.x(), s1.x(), s2.x(),
65  s0.y(), s1.y(), s2.y(),
66  1.0, 1.0, 1.0);
67  QTransform matrixGraph (g0.x(), g1.x(), g2.x(),
68  g0.y(), g1.y(), g2.y(),
69  1.0, 1.0, 1.0);
70 
72  MainWindowModel mainWindowModel;
73  t.setModelCoords (modelCoords,
74  mainWindowModel);
75  t.updateTransformFromMatrices(matrixScreen,
76  matrixGraph);
77 
79  m_g0Transformed);
81  m_g1Transformed);
83  m_g2Transformed);
85  m_s0Transformed);
87  m_s1Transformed);
89  m_s2Transformed);
90 }
91 
92 DocumentModelCoords TestTransformation::modelCoordsDefault() const
93 {
94  DocumentModelCoords modelCoords;
95 
96  modelCoords.setCoordScaleXTheta (COORD_SCALE_LINEAR);
97  modelCoords.setCoordScaleYRadius (COORD_SCALE_LINEAR);
98  modelCoords.setCoordsType (COORDS_TYPE_CARTESIAN);
99  modelCoords.setCoordUnitsDate(COORD_UNITS_DATE_YEAR_MONTH_DAY);
100  modelCoords.setCoordUnitsRadius (COORD_UNITS_NON_POLAR_THETA_NUMBER);
101  modelCoords.setCoordUnitsTheta (COORD_UNITS_POLAR_THETA_DEGREES);
102  modelCoords.setCoordUnitsTime (COORD_UNITS_TIME_HOUR_MINUTE_SECOND);
103  modelCoords.setCoordUnitsX (COORD_UNITS_NON_POLAR_THETA_NUMBER);
104  modelCoords.setCoordUnitsY (COORD_UNITS_NON_POLAR_THETA_NUMBER);
105  modelCoords.setOriginRadius (0.0);
106 
107  return modelCoords;
108 }
109 void TestTransformation::testCartesianLinearLinear ()
110 {
111  QPointF s0 (10, 1000);
112  QPointF s1 (1000, 1000);
113  QPointF s2 (10, 10);
114  QPointF g0 (1, 1);
115  QPointF g1 (10, 1);
116  QPointF g2 (1, 10);
117 
118  initTransformation (s0,
119  s1,
120  s2,
121  g0,
122  g1,
123  g2,
124  modelCoordsDefault());
125 
126  QVERIFY (differenceMagnitude (s0, m_s0Transformed) < EPSILON);
127  QVERIFY (differenceMagnitude (s1, m_s1Transformed) < EPSILON);
128  QVERIFY (differenceMagnitude (s2, m_s2Transformed) < EPSILON);
129  QVERIFY (differenceMagnitude (g0, m_g0Transformed) < EPSILON);
130  QVERIFY (differenceMagnitude (g1, m_g1Transformed) < EPSILON);
131  QVERIFY (differenceMagnitude (g2, m_g2Transformed) < EPSILON);
132 }
133 
134 void TestTransformation::testCartesianLinearLog ()
135 {
136  QPointF s0 (10, 1000);
137  QPointF s1 (1000, 1000);
138  QPointF s2 (10, 10);
139  QPointF g0 (1, 1);
140  QPointF g1 (10, 1);
141  QPointF g2 (1, 10);
142 
143  DocumentModelCoords modelCoords = modelCoordsDefault();
144  modelCoords.setCoordScaleYRadius (COORD_SCALE_LOG);
145  initTransformation (s0,
146  s1,
147  s2,
148  g0,
149  g1,
150  g2,
151  modelCoordsDefault());
152 
153  QVERIFY (differenceMagnitude (s0, m_s0Transformed) < EPSILON);
154  QVERIFY (differenceMagnitude (s1, m_s1Transformed) < EPSILON);
155  QVERIFY (differenceMagnitude (s2, m_s2Transformed) < EPSILON);
156  QVERIFY (differenceMagnitude (g0, m_g0Transformed) < EPSILON);
157  QVERIFY (differenceMagnitude (g1, m_g1Transformed) < EPSILON);
158  QVERIFY (differenceMagnitude (g2, m_g2Transformed) < EPSILON);
159 }
160 
161 void TestTransformation::testCartesianLogLinear ()
162 {
163  QPointF s0 (10, 1000);
164  QPointF s1 (1000, 1000);
165  QPointF s2 (10, 10);
166  QPointF g0 (1, 1);
167  QPointF g1 (10, 1);
168  QPointF g2 (1, 10);
169 
170  DocumentModelCoords modelCoords = modelCoordsDefault();
171  modelCoords.setCoordScaleXTheta (COORD_SCALE_LOG);
172  initTransformation (s0,
173  s1,
174  s2,
175  g0,
176  g1,
177  g2,
178  modelCoordsDefault());
179 
180  QVERIFY (differenceMagnitude (s0, m_s0Transformed) < EPSILON);
181  QVERIFY (differenceMagnitude (s1, m_s1Transformed) < EPSILON);
182  QVERIFY (differenceMagnitude (s2, m_s2Transformed) < EPSILON);
183  QVERIFY (differenceMagnitude (g0, m_g0Transformed) < EPSILON);
184  QVERIFY (differenceMagnitude (g1, m_g1Transformed) < EPSILON);
185  QVERIFY (differenceMagnitude (g2, m_g2Transformed) < EPSILON);
186 }
187 
188 void TestTransformation::testCartesianLogLog ()
189 {
190  QPointF s0 (10, 1000);
191  QPointF s1 (1000, 1000);
192  QPointF s2 (10, 10);
193  QPointF g0 (1, 1);
194  QPointF g1 (10, 1);
195  QPointF g2 (1, 10);
196 
197  DocumentModelCoords modelCoords = modelCoordsDefault();
198  modelCoords.setCoordScaleXTheta (COORD_SCALE_LOG);
199  modelCoords.setCoordScaleYRadius (COORD_SCALE_LOG);
200  initTransformation (s0,
201  s1,
202  s2,
203  g0,
204  g1,
205  g2,
206  modelCoordsDefault());
207 
208  QVERIFY (differenceMagnitude (s0, m_s0Transformed) < EPSILON);
209  QVERIFY (differenceMagnitude (s1, m_s1Transformed) < EPSILON);
210  QVERIFY (differenceMagnitude (s2, m_s2Transformed) < EPSILON);
211  QVERIFY (differenceMagnitude (g0, m_g0Transformed) < EPSILON);
212  QVERIFY (differenceMagnitude (g1, m_g1Transformed) < EPSILON);
213  QVERIFY (differenceMagnitude (g2, m_g2Transformed) < EPSILON);
214 }
215 
216 void TestTransformation::testPolarLinear ()
217 {
218  QPointF s0 (500, 1000);
219  QPointF s1 (1000, 500);
220  QPointF s2 (500, 500); // Origin at center
221  QPointF g0 (-90, 100);
222  QPointF g1 (0, 100);
223  QPointF g2 (0, 0);
224 
225  DocumentModelCoords modelCoords = modelCoordsDefault();
226  modelCoords.setCoordsType (COORDS_TYPE_POLAR);
227  initTransformation (s0,
228  s1,
229  s2,
230  g0,
231  g1,
232  g2,
233  modelCoordsDefault());
234 
235  QVERIFY (differenceMagnitude (s0, m_s0Transformed) < EPSILON);
236  QVERIFY (differenceMagnitude (s1, m_s1Transformed) < EPSILON);
237  QVERIFY (differenceMagnitude (s2, m_s2Transformed) < EPSILON);
238  QVERIFY (differenceMagnitude (g0, m_g0Transformed) < EPSILON);
239  QVERIFY (differenceMagnitude (g1, m_g1Transformed) < EPSILON);
240  QVERIFY (differenceMagnitude (g2, m_g2Transformed) < EPSILON);
241 }
242 
243 void TestTransformation::testPolarLogOffset1 ()
244 {
245  QPointF s0 (500, 1000);
246  QPointF s1 (1000, 500);
247  QPointF s2 (500, 500); // Origin at center
248  QPointF g0 (-90, 100);
249  QPointF g1 (0, 100);
250  QPointF g2 (0, 1);
251 
252  DocumentModelCoords modelCoords = modelCoordsDefault();
253  modelCoords.setCoordsType (COORDS_TYPE_POLAR);
254  modelCoords.setCoordScaleYRadius (COORD_SCALE_LOG);
255  modelCoords.setOriginRadius (1.0);
256  initTransformation (s0,
257  s1,
258  s2,
259  g0,
260  g1,
261  g2,
262  modelCoordsDefault());
263 
264  QVERIFY (differenceMagnitude (s0, m_s0Transformed) < EPSILON);
265  QVERIFY (differenceMagnitude (s1, m_s1Transformed) < EPSILON);
266  QVERIFY (differenceMagnitude (s2, m_s2Transformed) < EPSILON);
267  QVERIFY (differenceMagnitude (g0, m_g0Transformed) < EPSILON);
268  QVERIFY (differenceMagnitude (g1, m_g1Transformed) < EPSILON);
269  QVERIFY (differenceMagnitude (g2, m_g2Transformed) < EPSILON);
270 }
271 
272 void TestTransformation::testPolarLogOffset10 ()
273 {
274  QPointF s0 (500, 1000);
275  QPointF s1 (1000, 500);
276  QPointF s2 (500, 500); // Origin at center
277  QPointF g0 (-90, 100);
278  QPointF g1 (0, 100);
279  QPointF g2 (0, 10);
280 
281  DocumentModelCoords modelCoords = modelCoordsDefault();
282  modelCoords.setCoordsType (COORDS_TYPE_POLAR);
283  modelCoords.setCoordScaleYRadius (COORD_SCALE_LOG);
284  modelCoords.setOriginRadius (10.0);
285  initTransformation (s0,
286  s1,
287  s2,
288  g0,
289  g1,
290  g2,
291  modelCoordsDefault());
292 
293  QVERIFY (differenceMagnitude (s0, m_s0Transformed) < EPSILON);
294  QVERIFY (differenceMagnitude (s1, m_s1Transformed) < EPSILON);
295  QVERIFY (differenceMagnitude (s2, m_s2Transformed) < EPSILON);
296  QVERIFY (differenceMagnitude (g0, m_g0Transformed) < EPSILON);
297  QVERIFY (differenceMagnitude (g1, m_g1Transformed) < EPSILON);
298  QVERIFY (differenceMagnitude (g2, m_g2Transformed) < EPSILON);
299 }
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...
Model for DlgSettingsMainWindow.
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:83
void setCoordScaleXTheta(CoordScale coordScale)
Set method for linear/log scale on x/theta.
void setCoordsType(CoordsType coordsType)
Set method for coordinates type.