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 <qmath.h>
5 #include <QtTest/QtTest>
6 #include "Test/TestTransformation.h"
7 #include "Transformation.h"
8 
9 QTEST_MAIN (TestTransformation)
10 
11 const double EPSILON = 1.0;
12 
13 using namespace std;
14 
16  QObject(parent)
17 {
18 }
19 
20 void TestTransformation::cleanupTestCase ()
21 {
22 
23 }
24 
25 double TestTransformation::differenceMagnitude (const QPointF &vector1,
26  const QPointF &vector2) const
27 {
28  QPointF difference = vector1 - vector2;
29  return qSqrt (difference.x() * difference.x() +
30  difference.y() * difference.y());
31 }
32 void TestTransformation::initTestCase ()
33 {
34  const QString NO_ERROR_REPORT_LOG_FILE;
35  const bool NO_GNUPLOT_LOG_FILES = false;
36  const bool DEBUG_FLAG = false;
37  const QStringList NO_LOAD_STARTUP_FILES;
38 
39  initializeLogging ("engauge_test",
40  "engauge_test.log",
41  DEBUG_FLAG);
42 
43  MainWindow w (NO_ERROR_REPORT_LOG_FILE,
44  NO_GNUPLOT_LOG_FILES,
45  NO_LOAD_STARTUP_FILES);
46  w.show ();
47 }
48 
49 void TestTransformation::initTransformation (const QPointF &s0,
50  const QPointF &s1,
51  const QPointF &s2,
52  const QPointF &g0,
53  const QPointF &g1,
54  const QPointF &g2,
55  const DocumentModelCoords &modelCoords)
56 {
57  QTransform matrixScreen (s0.x(), s1.x(), s2.x(),
58  s0.y(), s1.y(), s2.y(),
59  1.0, 1.0, 1.0);
60  QTransform matrixGraph (g0.x(), g1.x(), g2.x(),
61  g0.y(), g1.y(), g2.y(),
62  1.0, 1.0, 1.0);
63 
65  t.setModelCoords (modelCoords);
66  t.updateTransformFromMatrices(matrixScreen,
67  matrixGraph);
68 
70  m_g0Transformed);
72  m_g1Transformed);
74  m_g2Transformed);
76  m_s0Transformed);
78  m_s1Transformed);
80  m_s2Transformed);
81 }
82 
83 DocumentModelCoords TestTransformation::modelCoordsDefault() const
84 {
85  DocumentModelCoords modelCoords;
86 
87  modelCoords.setCoordScaleXTheta (COORD_SCALE_LINEAR);
88  modelCoords.setCoordScaleYRadius (COORD_SCALE_LINEAR);
89  modelCoords.setCoordsType (COORDS_TYPE_CARTESIAN);
90  modelCoords.setCoordUnitsDate(COORD_UNITS_DATE_YEAR_MONTH_DAY);
91  modelCoords.setCoordUnitsRadius (COORD_UNITS_NON_POLAR_THETA_NUMBER);
92  modelCoords.setCoordUnitsTheta (COORD_UNITS_POLAR_THETA_DEGREES);
93  modelCoords.setCoordUnitsTime (COORD_UNITS_TIME_HOUR_MINUTE_SECOND);
94  modelCoords.setCoordUnitsX (COORD_UNITS_NON_POLAR_THETA_NUMBER);
95  modelCoords.setCoordUnitsY (COORD_UNITS_NON_POLAR_THETA_NUMBER);
96  modelCoords.setOriginRadius (0.0);
97 
98  return modelCoords;
99 }
100 void TestTransformation::testCartesianLinearLinear ()
101 {
102  QPointF s0 (10, 1000);
103  QPointF s1 (1000, 1000);
104  QPointF s2 (10, 10);
105  QPointF g0 (1, 1);
106  QPointF g1 (10, 1);
107  QPointF g2 (1, 10);
108 
109  initTransformation (s0,
110  s1,
111  s2,
112  g0,
113  g1,
114  g2,
115  modelCoordsDefault());
116 
117  QVERIFY (differenceMagnitude (s0, m_s0Transformed) < EPSILON);
118  QVERIFY (differenceMagnitude (s1, m_s1Transformed) < EPSILON);
119  QVERIFY (differenceMagnitude (s2, m_s2Transformed) < EPSILON);
120  QVERIFY (differenceMagnitude (g0, m_g0Transformed) < EPSILON);
121  QVERIFY (differenceMagnitude (g1, m_g1Transformed) < EPSILON);
122  QVERIFY (differenceMagnitude (g2, m_g2Transformed) < EPSILON);
123 }
124 
125 void TestTransformation::testCartesianLinearLog ()
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  DocumentModelCoords modelCoords = modelCoordsDefault();
135  modelCoords.setCoordScaleYRadius (COORD_SCALE_LOG);
136  initTransformation (s0,
137  s1,
138  s2,
139  g0,
140  g1,
141  g2,
142  modelCoordsDefault());
143 
144  QVERIFY (differenceMagnitude (s0, m_s0Transformed) < EPSILON);
145  QVERIFY (differenceMagnitude (s1, m_s1Transformed) < EPSILON);
146  QVERIFY (differenceMagnitude (s2, m_s2Transformed) < EPSILON);
147  QVERIFY (differenceMagnitude (g0, m_g0Transformed) < EPSILON);
148  QVERIFY (differenceMagnitude (g1, m_g1Transformed) < EPSILON);
149  QVERIFY (differenceMagnitude (g2, m_g2Transformed) < EPSILON);
150 }
151 
152 void TestTransformation::testCartesianLogLinear ()
153 {
154  QPointF s0 (10, 1000);
155  QPointF s1 (1000, 1000);
156  QPointF s2 (10, 10);
157  QPointF g0 (1, 1);
158  QPointF g1 (10, 1);
159  QPointF g2 (1, 10);
160 
161  DocumentModelCoords modelCoords = modelCoordsDefault();
162  modelCoords.setCoordScaleXTheta (COORD_SCALE_LOG);
163  initTransformation (s0,
164  s1,
165  s2,
166  g0,
167  g1,
168  g2,
169  modelCoordsDefault());
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::testCartesianLogLog ()
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  modelCoords.setCoordScaleYRadius (COORD_SCALE_LOG);
191  initTransformation (s0,
192  s1,
193  s2,
194  g0,
195  g1,
196  g2,
197  modelCoordsDefault());
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::testPolarLinear ()
208 {
209  QPointF s0 (500, 1000);
210  QPointF s1 (1000, 500);
211  QPointF s2 (500, 500); // Origin at center
212  QPointF g0 (-90, 100);
213  QPointF g1 (0, 100);
214  QPointF g2 (0, 0);
215 
216  DocumentModelCoords modelCoords = modelCoordsDefault();
217  modelCoords.setCoordsType (COORDS_TYPE_POLAR);
218  initTransformation (s0,
219  s1,
220  s2,
221  g0,
222  g1,
223  g2,
224  modelCoordsDefault());
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::testPolarLogOffset1 ()
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, 1);
242 
243  DocumentModelCoords modelCoords = modelCoordsDefault();
244  modelCoords.setCoordsType (COORDS_TYPE_POLAR);
245  modelCoords.setCoordScaleYRadius (COORD_SCALE_LOG);
246  modelCoords.setOriginRadius (1.0);
247  initTransformation (s0,
248  s1,
249  s2,
250  g0,
251  g1,
252  g2,
253  modelCoordsDefault());
254 
255  QVERIFY (differenceMagnitude (s0, m_s0Transformed) < EPSILON);
256  QVERIFY (differenceMagnitude (s1, m_s1Transformed) < EPSILON);
257  QVERIFY (differenceMagnitude (s2, m_s2Transformed) < EPSILON);
258  QVERIFY (differenceMagnitude (g0, m_g0Transformed) < EPSILON);
259  QVERIFY (differenceMagnitude (g1, m_g1Transformed) < EPSILON);
260  QVERIFY (differenceMagnitude (g2, m_g2Transformed) < EPSILON);
261 }
262 
263 void TestTransformation::testPolarLogOffset10 ()
264 {
265  QPointF s0 (500, 1000);
266  QPointF s1 (1000, 500);
267  QPointF s2 (500, 500); // Origin at center
268  QPointF g0 (-90, 100);
269  QPointF g1 (0, 100);
270  QPointF g2 (0, 10);
271 
272  DocumentModelCoords modelCoords = modelCoordsDefault();
273  modelCoords.setCoordsType (COORDS_TYPE_POLAR);
274  modelCoords.setCoordScaleYRadius (COORD_SCALE_LOG);
275  modelCoords.setOriginRadius (10.0);
276  initTransformation (s0,
277  s1,
278  s2,
279  g0,
280  g1,
281  g2,
282  modelCoordsDefault());
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 }
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...
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:66
void setCoordScaleXTheta(CoordScale coordScale)
Set method for linear/log scale on x/theta.
void setCoordsType(CoordsType coordsType)
Set method for coordinates type.