Engauge Digitizer 2
Loading...
Searching...
No Matches
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
13using namespace std;
14
18
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;
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
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}
QList< Point > Points
Definition Points.h:13
Model for DlgSettingsCoords and CmdSettingsCoords.
Model for DlgSettingsGeneral and CmdSettingsGeneral.
void loadXY(const QVector< QPointF > &positionsGraph, const DocumentModelCoords &modelCoords, const DocumentModelGeneral &modelGeneral, const MainWindowModel &modelMainWindow, const Transformation &transformation, QVector< QString > &x, QVector< QString > &y) const
Load x and y coordinate vectors.
void insertSubintervalsAndLoadDistances(int subintervalsPerInterval, const QVector< QPointF > &positionsGraph, QVector< QPointF > &positionsGraphWithSubintervals, QVector< QString > &distanceGraphForward, QVector< QString > &distancePercentForward, QVector< QString > &distanceGraphBackward, QVector< QString > &distancePercentBackward) const
Insert the specified number of subintervals into each interval.
void calculatePositionsGraph(const Points &points, const Transformation &transformation, QVector< QPointF > &positionsGraph) const
Convert screen positions to graph positions.
double functionArea(const QVector< QPointF > &positionsGraph) const
Use trapezoidal approximation to compute area under the function. Does not apply to relation.
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...
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 DlgSettingsMainWindow.
This class takes the output from Spline and uses that to draw the curve in the graphics window,...
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:14
Cubic interpolation given independent and dependent value vectors.
Definition Spline.h:30
Affine transformation between screen and graph coordinates, based on digitized axis points.
bool transformIsDefined() const
Transform is defined when at least three axis points have been digitized.