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