Engauge Digitizer  2
GeometryStrategyFunctionSmooth.cpp
1 /******************************************************************************************************
2  * (C) 2016 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 #include "GeometryStrategyFunctionSmooth.h"
8 #include "Spline.h"
9 #include "SplineDrawer.h"
10 #include "SplinePair.h"
11 #include "Transformation.h"
12 
13 using namespace std;
14 
16 {
17 }
18 
19 GeometryStrategyFunctionSmooth::~GeometryStrategyFunctionSmooth()
20 {
21 }
22 
24  const DocumentModelCoords &modelCoords,
25  const DocumentModelGeneral &modelGeneral,
26  const MainWindowModel &modelMainWindow,
27  const Transformation &transformation,
28  QString &funcArea,
29  QString &polyArea,
30  QVector<QString> &x,
31  QVector<QString> &y,
32  QVector<bool> &isPotentialExportAmbiguity,
33  QVector<QString> &distanceGraphForward,
34  QVector<QString> &distancePercentForward,
35  QVector<QString> &distanceGraphBackward,
36  QVector<QString> &distancePercentBackward) const
37 {
38  const int NUM_SUB_INTERVALS_SMOOTH = 10; // One input point becomes NUM_SUB_INTERVALS points to account for smoothing
39 
40  QVector<QPointF> positionsGraph, positionsGraphWithSubintervals;
41  calculatePositionsGraph (points,
42  transformation,
43  positionsGraph);
44 
45  insertSubintervalsAndLoadDistances (NUM_SUB_INTERVALS_SMOOTH,
46  positionsGraph,
47  positionsGraphWithSubintervals,
48  distanceGraphForward,
49  distancePercentForward,
50  distanceGraphBackward,
51  distancePercentBackward);
52  double fArea = functionArea (positionsGraphWithSubintervals);
53 
54  loadXY (positionsGraph,
55  modelCoords,
56  modelGeneral,
57  modelMainWindow,
58  transformation,
59  x,
60  y);
61 
62  loadSmoothAmbiguityVector (x,
63  y,
64  transformation,
65  isPotentialExportAmbiguity);
66 
67  // Set header values
68  funcArea = QString::number (fArea);
69  polyArea = "";
70 }
71 
73  QVector<QString> &y,
74  const Transformation &transformation,
75  QVector<bool> &isPotentialExportAmbiguity) const
76 {
77  // There are N-1 segments for N points
78  int numSegments = x.size () - 1;
79 
80  // Graph/screen transformation must be defined for SplineDrawer, and
81  // at least one point must be defined for Spline. Even better, one segment
82  // must be defined for Spline
83  if (transformation.transformIsDefined() &&
84  numSegments > 0) {
85 
86  // Create spline
87  vector<double> t (unsigned (x.size ()));
88  vector<SplinePair> xy (unsigned (x.size ()));
89  for (unsigned int i = 0; i < unsigned (x.size ()); i++) {
90  t [i] = i;
91  xy [i] = SplinePair (x.at (signed (i)).toDouble (),
92  y.at (signed (i)).toDouble ());
93  }
94  Spline s (t,
95  xy);
96 
97  SplineDrawer sd (transformation);
98 
99  for (int segment = 0; segment < numSegments; segment++) {
100  bool isMultiValued = sd.segmentIsMultiValued (s,
101  x.size (),
102  segment);
103  isPotentialExportAmbiguity.push_back (isMultiValued);
104  }
105  } else {
106 
107  for (int segment = 0; segment < numSegments; segment++) {
108  isPotentialExportAmbiguity.push_back (false);
109  }
110  }
111 }
virtual void calculateGeometry(const Points &points, const DocumentModelCoords &modelCoords, const DocumentModelGeneral &modelGeneral, const MainWindowModel &modelMainWindow, const Transformation &transformation, QString &funcArea, QString &polyArea, QVector< QString > &x, QVector< QString > &y, QVector< bool > &isPotentialExportAmbiguity, QVector< QString > &distanceGraphForward, QVector< QString > &distancePercentForward, QVector< QString > &distanceGraphBackward, QVector< QString > &distancePercentBackward) const
Calculate geometry parameters.
Model for DlgSettingsGeneral and CmdSettingsGeneral.
Cubic interpolation given independent and dependent value vectors.
Definition: Spline.h:29
Affine transformation between screen and graph coordinates, based on digitized axis points.
Model for DlgSettingsMainWindow.
Model for DlgSettingsCoords and CmdSettingsCoords.
bool transformIsDefined() const
Transform is defined when at least three axis points have been digitized.
This class takes the output from Spline and uses that to draw the curve in the graphics window,...
Definition: SplineDrawer.h:35
bool segmentIsMultiValued(const Spline &spline, int numSegments, int segment) const
Return true if specified segment is multi-valued, else false.
Single X/Y pair for cubic spline interpolation initialization and calculations.
Definition: SplinePair.h:13
virtual void loadSmoothAmbiguityVector(QVector< QString > &x, QVector< QString > &y, const Transformation &transformation, QVector< bool > &isPotentialExportAmbiguity) const
Generate a vector that identifies points belonging to segments that overlap, for smoothly connected f...