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