Engauge Digitizer  2
CallbackAxisPointsAbstract.h
1 /******************************************************************************************************
2  * (C) 2014 markummitchell@github.com. This file is part of Engauge Digitizer, which is released *
3  * under GNU General Public License version 2 (GPLv2) or (at your option) any later version. See file *
4  * LICENSE or go to gnu.org/licenses for details. Distribution requires prior written permission. *
5  ******************************************************************************************************/
6 
7 #ifndef CALLBACK_AXIS_POINTS_ABSTRACT
8 #define CALLBACK_AXIS_POINTS_ABSTRACT
9 
10 #include "CallbackSearchReturn.h"
11 #include "DocumentAxesPointsRequired.h"
12 #include "DocumentModelCoords.h"
13 #include <QList>
14 #include <QString>
15 #include <QTransform>
16 
17 typedef QList<QPointF> CoordPairVector;
18 typedef QList<double> CoordSingleVector;
19 
20 class Point;
21 
36 {
38  friend class TestGraphCoords;
39 
40 public:
43  DocumentAxesPointsRequired documentAxesPointsRequired);
44 
47  const QString pointIdentifierOverride,
48  const QPointF &posGraphOverride,
49  const QPointF &posScreenOverride,
50  DocumentAxesPointsRequired documentAxesPointsRequired);
51 
53  CallbackSearchReturn callback (const QString &curveName,
54  const Point &point);
55 
58  QTransform matrixGraph () const;
59 
62  QTransform matrixScreen () const;
63 
65  double xGraphRange () const { return m_xGraphHigh - m_xGraphLow; }
66 
68  double yGraphRange () const { return m_yGraphHigh - m_yGraphLow; }
69 
70 protected:
71 
73  DocumentAxesPointsRequired documentAxesPointsRequired() const;
74 
76  QString errorMessage () const { return m_errorMessage; }
77 
80  bool isError () const { return m_isError; }
81 
83  unsigned int numberAxisPoints () const;
84 
85 private:
86 
88  bool anyPointsRepeatPair (const CoordPairVector &vector,
89  double epsilon) const;
90 
92  bool anyPointsRepeatSingle (const CoordSingleVector &vector,
93  double epsilon) const;
94  CallbackSearchReturn callbackRequire2AxisPoints (const QPointF &posScreen,
95  const QPointF &posGraph);
96  CallbackSearchReturn callbackRequire3AxisPoints (const QPointF &posScreen,
97  const QPointF &posGraph);
98  CallbackSearchReturn callbackRequire4AxisPoints (bool isXOnly,
99  const QPointF &posScreen,
100  const QPointF &posGraph);
101  void computeTransforms3();
102  void computeTransforms4();
103  void loadTransforms2();
104  void loadTransforms3();
105  void loadTransforms4();
106  bool threePointsAreCollinear (const QTransform &transform);
107 
108  // Coordinates information that will be applied to the coordinates before they are used to compute the transformation
109  DocumentModelCoords m_modelCoords;
110 
111  // For overriding one existing Point. Identifier is empty for no overriding
112  QString m_pointIdentifierOverride;
113  QPointF m_posScreenOverride;
114  QPointF m_posGraphOverride;
115 
116  // Storage of (x,y) axes points for DOCUMENT_AXES_POINTS_REQUIRED_3
117  CoordPairVector m_screenInputs;
118  CoordPairVector m_graphOutputs;
119 
120  // Storage of (x) and (y) axes points for DOCUMENT_AXES_POINTS_REQUIRED_4
121  CoordPairVector m_screenInputsX; // Accumulated screen coordinates for x axis points
122  CoordPairVector m_screenInputsY; // Accumulated screen coordinates for y axis points
123  CoordSingleVector m_graphOutputsX; // Accumulated x values for x axis points
124  CoordSingleVector m_graphOutputsY; // Accumulated y values for y axis points
125 
126  // Transforms computed from DOCUMENT_AXES_POINTS_REQUIRED_3 or DOCUMENT_AXES_POINTS_REQUIRED_4 variables
127  QTransform m_screenInputsTransform;
128  QTransform m_graphOutputsTransform;
129 
130  // Errors
131  bool m_isError;
132  QString m_errorMessage;
133 
134  // For computing the ranges of the graph coordinates
135  double m_xGraphLow;
136  double m_yGraphLow;
137  double m_xGraphHigh;
138  double m_yGraphHigh;
139 
140  // Either 3 points (each having x AND y coordinates) or 4 points (each having x OR y coordinate) define the transform
141  DocumentAxesPointsRequired m_documentAxesPointsRequired;
142 };
143 
144 #endif // CALLBACK_AXIS_POINTS_ABSTRACT
QTransform matrixScreen() const
Returns screen coordinates matrix after transformIsDefined has already indicated success.
Unit tests of graph coordinate sanity checking.
Class that represents one digitized point. The screen-to-graph coordinate transformation is always ex...
Definition: Point.h:25
double yGraphRange() const
Return the range of the y graph coordinate from low to high, after the transform is defined.
unsigned int numberAxisPoints() const
Number of axis points which is less than 3 if the axes curve is incomplete.
QString errorMessage() const
This value is checked after iterating to see what was wrong if the axis data was incorrect.
Model for DlgSettingsCoords and CmdSettingsCoords.
CallbackAxisPointsAbstract(const DocumentModelCoords &modelCoords, DocumentAxesPointsRequired documentAxesPointsRequired)
Constructor for when all of the existing axis points are to be processed as is.
bool isError() const
This value is checked after iterating to see if the axis data is correct.
double xGraphRange() const
Return the range of the x graph coordinate from low to high, after the transform is defined.
QTransform matrixGraph() const
Returns graph coordinates matrix after transformIsDefined has already indicated success.
Callback for collecting axis points and then performing common calculations on those axis points.
DocumentAxesPointsRequired documentAxesPointsRequired() const
Number of axes points required for the transformation.
CallbackSearchReturn callback(const QString &curveName, const Point &point)
Callback method.