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