7 #include "EngaugeAssert.h" 8 #include "FormatCoordsUnits.h" 9 #include "GeometryStrategyAbstractBase.h" 13 #include "SplinePair.h" 14 #include "Transformation.h" 23 GeometryStrategyAbstractBase::~GeometryStrategyAbstractBase()
29 QVector<QPointF> &positionsGraph)
const 31 positionsGraph.clear();
33 for (
int i = 0; i < points.size(); i++) {
34 const Point &pointScreen = points [i];
35 QPointF posScreen = pointScreen.
posScreen ();
41 positionsGraph.push_back (posGraph);
48 double sum = 0, xLast = 0, yLast = 0;
49 for (
int i = 1; i < positionsGraph.size (); i++) {
50 double x = positionsGraph [i].x();
51 double y = positionsGraph [i].y();
52 double area = 0.5 * (y + yLast) * (x - xLast);
62 const QVector<QPointF> &positionsGraph,
63 QVector<QPointF> &positionsGraphWithSubintervals,
64 QVector<QString> &distanceGraphForward,
65 QVector<QString> &distancePercentForward,
66 QVector<QString> &distanceGraphBackward,
67 QVector<QString> &distancePercentBackward)
const 69 if (positionsGraph.size () > 0) {
75 vector<SplinePair> xy;
76 for (
int i = 0; i < positionsGraph.size (); i++) {
77 t.push_back ((
double) i);
78 xy.push_back (
SplinePair (positionsGraph [i].x(),
79 positionsGraph [i].y()));
86 QVector<double> distanceGraphDouble;
87 double xLast = 0, yLast = 0, distance = 0;
88 for (i = 0; i < positionsGraph.size(); i++) {
91 for (
int subinterval = 0; subinterval < subintervalsPerInterval; subinterval++) {
94 double t = (double) (i - 1.0) + (double) (subinterval + 1) / (double) (subintervalsPerInterval);
98 double x = splinePair.
x ();
99 double y = splinePair.
y ();
102 if (i > 0 || subinterval == subintervalsPerInterval - 1) {
105 positionsGraphWithSubintervals.push_back (QPointF (x, y));
112 distance += qSqrt ((x - xLast) * (x - xLast) + (y - yLast) * (y - yLast));
121 distanceGraphDouble.push_back (distance);
125 double dTotal = qMax (1.0, distanceGraphDouble [distanceGraphDouble.size() - 1]);
126 for (i = 0; i < distanceGraphDouble.size (); i++) {
127 double d = distanceGraphDouble [i];
128 distanceGraphForward.push_back (QString::number (d));
129 distancePercentForward.push_back (QString::number (100.0 * d / dTotal));
130 distanceGraphBackward.push_back (QString::number (dTotal - d));
131 distancePercentBackward.push_back (QString::number (100.0 * (dTotal - d) / dTotal));
141 QVector<QString> &y)
const 145 for (
int i = 0; i < positionsGraph.size(); i++) {
147 double xI = positionsGraph [i].x();
148 double yI = positionsGraph [i].y();
150 QString xFormatted, yFormatted;
158 x.push_back (xFormatted);
159 y.push_back (yFormatted);
167 int N = points.size ();
173 for (
int i = 0; i < N - 1; i++) {
174 sum += points [i].x() * points [i + 1].y() - points [i + 1].x() * points [i].y();
177 sum += points [N - 1].x() * points [0].y() - points [0].x() * points [N - 1].y ();
180 return qAbs (sum) / 2.0;
void calculatePositionsGraph(const Points &points, const Transformation &transformation, QVector< QPointF > &positionsGraph) const
Convert screen positions to graph positions.
SplinePair interpolateCoeff(double t) const
Return interpolated y for specified x.
Cubic interpolation given independent and dependent value vectors.
double functionArea(const QVector< QPointF > &positionsGraph) const
Use trapezoidal approximation to compute area under the function. Does not apply to relation...
double y() const
Get method for y.
Class that represents one digitized point. The screen-to-graph coordinate transformation is always ex...
QPointF posScreen() const
Accessor for screen position.
Model for DlgSettingsMainWindow.
Model for DlgSettingsCoords and CmdSettingsCoords.
double x() const
Get method for x.
GeometryStrategyAbstractBase()
Single constructor.
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.
double polygonAreaForSimplyConnected(const QVector< QPointF > &points) const
Area in polygon using Shoelace formula, which only works if polygon is simply connected.
void loadXY(const QVector< QPointF > &positionsGraph, const DocumentModelCoords &modelCoords, const MainWindowModel &modelMainWindow, const Transformation &transformation, QVector< QString > &x, QVector< QString > &y) const
Load x and y coordinate vectors.
Single X/Y pair for cubic spline interpolation initialization and calculations.