Engauge Digitizer  2
TestTransformation.cpp
1 #include "DocumentModelCoords.h"
2 #include "DocumentModelGeneral.h"
3 #include "Logger.h"
4 #include "MainWindow.h"
5 #include "MainWindowModel.h"
6 #include <qmath.h>
7 #include <QtTest/QtTest>
8 #include "Test/TestTransformation.h"
9 #include "Transformation.h"
10 
11 QTEST_MAIN (TestTransformation)
12 
13 const double EPSILON = 1.0;
14 
15 using namespace std;
16 
18  QObject(parent)
19 {
20 }
21 
22 void TestTransformation::cleanupTestCase ()
23 {
24 
25 }
26 
27 double TestTransformation::differenceMagnitude (const QPointF &vector1,
28  const QPointF &vector2) const
29 {
30  QPointF difference = vector1 - vector2;
31  return qSqrt (difference.x() * difference.x() +
32  difference.y() * difference.y());
33 }
34 void TestTransformation::initTestCase ()
35 {
36  const QString NO_ERROR_REPORT_LOG_FILE;
37  const QString NO_REGRESSION_OPEN_FILE;
38  const bool NO_GNUPLOT_LOG_FILES = false;
39  const bool NO_REGRESSION_IMPORT = false;
40  const bool NO_RESET = false;
41  const bool NO_EXPORT_ONLY = false;
42  const bool NO_EXTRACT_IMAGE_ONLY = false;
43  const QString NO_EXTRACT_IMAGE_EXTENSION;
44  const bool DEBUG_FLAG = false;
45  const QStringList NO_LOAD_STARTUP_FILES;
46  const QStringList NO_COMMAND_LINE;
47 
48  initializeLogging ("engauge_test",
49  "engauge_test.log",
50  DEBUG_FLAG);
51 
52  MainWindow w (NO_ERROR_REPORT_LOG_FILE,
53  NO_REGRESSION_OPEN_FILE,
54  NO_REGRESSION_IMPORT,
55  NO_GNUPLOT_LOG_FILES,
56  NO_RESET,
57  NO_EXPORT_ONLY,
58  NO_EXTRACT_IMAGE_ONLY,
59  NO_EXTRACT_IMAGE_EXTENSION,
60  NO_LOAD_STARTUP_FILES,
61  NO_COMMAND_LINE);
62  w.show ();
63 }
64 
65 void TestTransformation::initTransformation (const QPointF &s0,
66  const QPointF &s1,
67  const QPointF &s2,
68  const QPointF &g0,
69  const QPointF &g1,
70  const QPointF &g2,
71  const DocumentModelCoords &modelCoords,
72  const DocumentModelGeneral &modelGeneral)
73 {
74  QTransform matrixScreen (s0.x(), s1.x(), s2.x(),
75  s0.y(), s1.y(), s2.y(),
76  1.0, 1.0, 1.0);
77  QTransform matrixGraph (g0.x(), g1.x(), g2.x(),
78  g0.y(), g1.y(), g2.y(),
79  1.0, 1.0, 1.0);
80 
82  MainWindowModel mainWindowModel;
83  t.setModelCoords (modelCoords,
84  modelGeneral,
85  mainWindowModel);
86  t.updateTransformFromMatrices(matrixScreen,
87  matrixGraph);
88 
90  m_g0Transformed);
92  m_g1Transformed);
94  m_g2Transformed);
96  m_s0Transformed);
98  m_s1Transformed);
100  m_s2Transformed);
101 }
102 
103 DocumentModelCoords TestTransformation::modelCoordsDefault() const
104 {
105  DocumentModelCoords modelCoords;
106 
107  modelCoords.setCoordScaleXTheta (COORD_SCALE_LINEAR);
108  modelCoords.setCoordScaleYRadius (COORD_SCALE_LINEAR);
109  modelCoords.setCoordsType (COORDS_TYPE_CARTESIAN);
110  modelCoords.setCoordUnitsDate(COORD_UNITS_DATE_YEAR_MONTH_DAY);
111  modelCoords.setCoordUnitsRadius (COORD_UNITS_NON_POLAR_THETA_NUMBER);
112  modelCoords.setCoordUnitsTheta (COORD_UNITS_POLAR_THETA_DEGREES);
113  modelCoords.setCoordUnitsTime (COORD_UNITS_TIME_HOUR_MINUTE_SECOND);
114  modelCoords.setCoordUnitsX (COORD_UNITS_NON_POLAR_THETA_NUMBER);
115  modelCoords.setCoordUnitsY (COORD_UNITS_NON_POLAR_THETA_NUMBER);
116  modelCoords.setOriginRadius (0.0);
117 
118  return modelCoords;
119 }
120 
121 DocumentModelGeneral TestTransformation::modelGeneralDefault() const
122 {
123  DocumentModelGeneral modelGeneral;
124 
125  modelGeneral.setCursorSize (5);
126  modelGeneral.setExtraPrecision (1);
127 
128  return modelGeneral;
129 }
130 
131 void TestTransformation::testCartesianLinearLinear ()
132 {
133  QPointF s0 (10, 1000);
134  QPointF s1 (1000, 1000);
135  QPointF s2 (10, 10);
136  QPointF g0 (1, 1);
137  QPointF g1 (10, 1);
138  QPointF g2 (1, 10);
139 
140  initTransformation (s0,
141  s1,
142  s2,
143  g0,
144  g1,
145  g2,
146  modelCoordsDefault(),
147  modelGeneralDefault());
148 
149  QVERIFY ((differenceMagnitude (s0, m_s0Transformed) < EPSILON));
150  QVERIFY ((differenceMagnitude (s1, m_s1Transformed) < EPSILON));
151  QVERIFY ((differenceMagnitude (s2, m_s2Transformed) < EPSILON));
152  QVERIFY ((differenceMagnitude (g0, m_g0Transformed) < EPSILON));
153  QVERIFY ((differenceMagnitude (g1, m_g1Transformed) < EPSILON));
154  QVERIFY ((differenceMagnitude (g2, m_g2Transformed) < EPSILON));
155 }
156 
157 void TestTransformation::testCartesianLinearLog ()
158 {
159  QPointF s0 (10, 1000);
160  QPointF s1 (1000, 1000);
161  QPointF s2 (10, 10);
162  QPointF g0 (1, 1);
163  QPointF g1 (10, 1);
164  QPointF g2 (1, 10);
165 
166  DocumentModelCoords modelCoords = modelCoordsDefault();
167  modelCoords.setCoordScaleYRadius (COORD_SCALE_LOG);
168  initTransformation (s0,
169  s1,
170  s2,
171  g0,
172  g1,
173  g2,
174  modelCoordsDefault(),
175  modelGeneralDefault());
176 
177  QVERIFY ((differenceMagnitude (s0, m_s0Transformed) < EPSILON));
178  QVERIFY ((differenceMagnitude (s1, m_s1Transformed) < EPSILON));
179  QVERIFY ((differenceMagnitude (s2, m_s2Transformed) < EPSILON));
180  QVERIFY ((differenceMagnitude (g0, m_g0Transformed) < EPSILON));
181  QVERIFY ((differenceMagnitude (g1, m_g1Transformed) < EPSILON));
182  QVERIFY ((differenceMagnitude (g2, m_g2Transformed) < EPSILON));
183 }
184 
185 void TestTransformation::testCartesianLogLinear ()
186 {
187  QPointF s0 (10, 1000);
188  QPointF s1 (1000, 1000);
189  QPointF s2 (10, 10);
190  QPointF g0 (1, 1);
191  QPointF g1 (10, 1);
192  QPointF g2 (1, 10);
193 
194  DocumentModelCoords modelCoords = modelCoordsDefault();
195  modelCoords.setCoordScaleXTheta (COORD_SCALE_LOG);
196  initTransformation (s0,
197  s1,
198  s2,
199  g0,
200  g1,
201  g2,
202  modelCoordsDefault(),
203  modelGeneralDefault());
204 
205  QVERIFY ((differenceMagnitude (s0, m_s0Transformed) < EPSILON));
206  QVERIFY ((differenceMagnitude (s1, m_s1Transformed) < EPSILON));
207  QVERIFY ((differenceMagnitude (s2, m_s2Transformed) < EPSILON));
208  QVERIFY ((differenceMagnitude (g0, m_g0Transformed) < EPSILON));
209  QVERIFY ((differenceMagnitude (g1, m_g1Transformed) < EPSILON));
210  QVERIFY ((differenceMagnitude (g2, m_g2Transformed) < EPSILON));
211 }
212 
213 void TestTransformation::testCartesianLogLog ()
214 {
215  QPointF s0 (10, 1000);
216  QPointF s1 (1000, 1000);
217  QPointF s2 (10, 10);
218  QPointF g0 (1, 1);
219  QPointF g1 (10, 1);
220  QPointF g2 (1, 10);
221 
222  DocumentModelCoords modelCoords = modelCoordsDefault();
223  modelCoords.setCoordScaleXTheta (COORD_SCALE_LOG);
224  modelCoords.setCoordScaleYRadius (COORD_SCALE_LOG);
225  initTransformation (s0,
226  s1,
227  s2,
228  g0,
229  g1,
230  g2,
231  modelCoordsDefault(),
232  modelGeneralDefault());
233 
234  QVERIFY ((differenceMagnitude (s0, m_s0Transformed) < EPSILON));
235  QVERIFY ((differenceMagnitude (s1, m_s1Transformed) < EPSILON));
236  QVERIFY ((differenceMagnitude (s2, m_s2Transformed) < EPSILON));
237  QVERIFY ((differenceMagnitude (g0, m_g0Transformed) < EPSILON));
238  QVERIFY ((differenceMagnitude (g1, m_g1Transformed) < EPSILON));
239  QVERIFY ((differenceMagnitude (g2, m_g2Transformed) < EPSILON));
240 }
241 
242 void TestTransformation::testPolarLinear ()
243 {
244  QPointF s0 (500, 1000);
245  QPointF s1 (1000, 500);
246  QPointF s2 (500, 500); // Origin at center
247  QPointF g0 (-90, 100);
248  QPointF g1 (0, 100);
249  QPointF g2 (0, 0);
250 
251  DocumentModelCoords modelCoords = modelCoordsDefault();
252  modelCoords.setCoordsType (COORDS_TYPE_POLAR);
253  initTransformation (s0,
254  s1,
255  s2,
256  g0,
257  g1,
258  g2,
259  modelCoordsDefault(),
260  modelGeneralDefault());
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::testPolarLogOffset1 ()
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, 1);
278 
279  DocumentModelCoords modelCoords = modelCoordsDefault();
280  modelCoords.setCoordsType (COORDS_TYPE_POLAR);
281  modelCoords.setCoordScaleYRadius (COORD_SCALE_LOG);
282  modelCoords.setOriginRadius (1.0);
283  initTransformation (s0,
284  s1,
285  s2,
286  g0,
287  g1,
288  g2,
289  modelCoordsDefault(),
290  modelGeneralDefault());
291 
292  QVERIFY ((differenceMagnitude (s0, m_s0Transformed) < EPSILON));
293  QVERIFY ((differenceMagnitude (s1, m_s1Transformed) < EPSILON));
294  QVERIFY ((differenceMagnitude (s2, m_s2Transformed) < EPSILON));
295  QVERIFY ((differenceMagnitude (g0, m_g0Transformed) < EPSILON));
296  QVERIFY ((differenceMagnitude (g1, m_g1Transformed) < EPSILON));
297  QVERIFY ((differenceMagnitude (g2, m_g2Transformed) < EPSILON));
298 }
299 
300 void TestTransformation::testPolarLogOffset10 ()
301 {
302  QPointF s0 (500, 1000);
303  QPointF s1 (1000, 500);
304  QPointF s2 (500, 500); // Origin at center
305  QPointF g0 (-90, 100);
306  QPointF g1 (0, 100);
307  QPointF g2 (0, 10);
308 
309  DocumentModelCoords modelCoords = modelCoordsDefault();
310  modelCoords.setCoordsType (COORDS_TYPE_POLAR);
311  modelCoords.setCoordScaleYRadius (COORD_SCALE_LOG);
312  modelCoords.setOriginRadius (10.0);
313  initTransformation (s0,
314  s1,
315  s2,
316  g0,
317  g1,
318  g2,
319  modelCoordsDefault(),
320  modelGeneralDefault());
321 
322  QVERIFY ((differenceMagnitude (s0, m_s0Transformed) < EPSILON));
323  QVERIFY ((differenceMagnitude (s1, m_s1Transformed) < EPSILON));
324  QVERIFY ((differenceMagnitude (s2, m_s2Transformed) < EPSILON));
325  QVERIFY ((differenceMagnitude (g0, m_g0Transformed) < EPSILON));
326  QVERIFY ((differenceMagnitude (g1, m_g1Transformed) < EPSILON));
327  QVERIFY ((differenceMagnitude (g2, m_g2Transformed) < EPSILON));
328 }
void setCoordUnitsTime(CoordUnitsTime coordUnits)
Set method for time units.
Model for DlgSettingsGeneral and CmdSettingsGeneral.
void setCoordUnitsDate(CoordUnitsDate coordUnits)
Set method for date units.
void setCursorSize(int cursorSize)
Set method for effective cursor size.
void setCoordUnitsY(CoordUnitsNonPolarTheta coordUnits)
Set method for y units.
TestTransformation(QObject *parent=0)
Single constructor.
void setCoordUnitsX(CoordUnitsNonPolarTheta coordUnits)
Set method for x units.
void setCoordScaleYRadius(CoordScale coordScale)
Set method for linear/log scale on y/radius.
void transformRawGraphToScreen(const QPointF &pointRaw, QPointF &pointScreen) const
Transform from raw graph coordinates to linear cartesian graph coordinates, then to screen coordinate...
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 transformScreenToRawGraph(const QPointF &coordScreen, QPointF &coordGraph) const
Transform from cartesian pixel screen coordinates to cartesian/polar graph coordinates.
void setExtraPrecision(int extraPrecision)
Set method for extra digits of precision.
Main window consisting of menu, graphics scene, status bar and optional toolbars as a Single Document...
Definition: MainWindow.h:91
void setCoordScaleXTheta(CoordScale coordScale)
Set method for linear/log scale on x/theta.
void setCoordsType(CoordsType coordsType)
Set method for coordinates type.