Engauge Digitizer  2
GeometryStrategyFunctionSmooth.cpp
Go to the documentation of this file.
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 
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 
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 }
Spline
Cubic interpolation given independent and dependent value vectors.
Definition: Spline.h:28
Points
QList< Point > Points
Definition: Points.h:12
SplinePair
Single X/Y pair for cubic spline interpolation initialization and calculations.
Definition: SplinePair.h:12
Transformation::transformIsDefined
bool transformIsDefined() const
Transform is defined when at least three axis points have been digitized.
Definition: Transformation.cpp:335
Transformation
Affine transformation between screen and graph coordinates, based on digitized axis points.
Definition: Transformation.h:30
SplineDrawer::segmentIsMultiValued
bool segmentIsMultiValued(const Spline &spline, int numSegments, int segment) const
Return true if specified segment is multi-valued, else false.
Definition: SplineDrawer.cpp:48
GeometryStrategyFunctionSmooth::calculateGeometry
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.
Definition: GeometryStrategyFunctionSmooth.cpp:22
MainWindowModel
Model for DlgSettingsMainWindow.
Definition: MainWindowModel.h:29
GeometryStrategyFunctionSmooth::loadSmoothAmbiguityVector
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...
Definition: GeometryStrategyFunctionSmooth.cpp:71
Transformation.h
DocumentModelGeneral
Model for DlgSettingsGeneral and CmdSettingsGeneral.
Definition: DocumentModelGeneral.h:15
SplineDrawer
This class takes the output from Spline and uses that to draw the curve in the graphics window,...
Definition: SplineDrawer.h:34
GeometryStrategyFunctionSmooth::GeometryStrategyFunctionSmooth
GeometryStrategyFunctionSmooth()
Single constructor.
Definition: GeometryStrategyFunctionSmooth.cpp:14
GeometryStrategyFunctionSmooth.h
GeometryStrategyFunctionSmooth::~GeometryStrategyFunctionSmooth
virtual ~GeometryStrategyFunctionSmooth()
Definition: GeometryStrategyFunctionSmooth.cpp:18
SplinePair.h
DocumentModelCoords
Model for DlgSettingsCoords and CmdSettingsCoords.
Definition: DocumentModelCoords.h:19
SplineDrawer.h
Spline.h