Engauge Digitizer 2
Loading...
Searching...
No Matches
FormatCoordsUnitsStrategyAbstractBase.cpp
Go to the documentation of this file.
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
9#include "Logger.h"
10#include <qmath.h>
11#include "Transformation.h"
12
16
18 double valueUnformattedOther,
19 bool isXTheta,
20 const DocumentModelGeneral &modelGeneral,
21 const Transformation &transformation) const
22{
23 //LOG4CPP_DEBUG_S ((*mainCat)) << "FormatCoordsUnitsStrategyAbstractBase::precisionDigitsForRawNumber";
24
25 const double PIXEL_SHIFT = 1;
26 const int DEFAULT_PRECISION = 5; // Precision used before transformation is available. Equal or greater than x/y pixel counts
27
28 if (transformation.transformIsDefined()) {
29
30 // Measure the resolution if the point is moved some number of pixels in screen coordinates
31 QPointF posGraph;
32 if (isXTheta) {
33
34 posGraph = QPointF (valueUnformatted,
35 valueUnformattedOther);
36
37 } else {
38
39 posGraph = QPointF (valueUnformattedOther,
40 valueUnformatted);
41
42 }
43
44 QPointF posScreen, posScreenShifted, posGraphShifted;
45
46 transformation.transformRawGraphToScreen (posGraph,
47 posScreen);
48
49 posScreenShifted = posScreen + QPointF (PIXEL_SHIFT, PIXEL_SHIFT);
50
51 transformation.transformScreenToRawGraph (posScreenShifted,
52 posGraphShifted);
53
54 double xResolutionPerPixel = (posGraphShifted.x() - posGraph.x()) / PIXEL_SHIFT;
55 double yResolutionPerPixel = (posGraphShifted.y() - posGraph.y()) / PIXEL_SHIFT;
56 double resolutionPerPixel = (isXTheta ? xResolutionPerPixel : yResolutionPerPixel);
57
58 // Compute number of digits ahead of the decimal point (any single decimal place would work but the decimal point is easiest)
59 int powerValue = qFloor (qLn (qAbs (valueUnformatted)) / qLn (10.0));
60 int powerResolution = qFloor (qLn (qAbs (resolutionPerPixel)) / qLn (10.0));
61
62 int numberDigitsForResolution = powerValue - powerResolution + 1 + modelGeneral.extraPrecision();
63
64 return numberDigitsForResolution + 1; // Add one just to be safe
65
66 } else {
67
68 return DEFAULT_PRECISION;
69 }
70}
Model for DlgSettingsGeneral and CmdSettingsGeneral.
int extraPrecision() const
Get method for extra digits of precsion.
int precisionDigitsForRawNumber(double valueUnformatted, double valueUnformattedOther, bool isXTheta, const DocumentModelGeneral &modelGeneral, const Transformation &transformation) const
Compute precision for outputting an unformatted value, consistent with the resolution at the point wh...
Affine transformation between screen and graph coordinates, based on digitized axis points.
void transformRawGraphToScreen(const QPointF &pointRaw, QPointF &pointScreen) const
Transform from raw graph coordinates to linear cartesian graph coordinates, then to screen coordinate...
void transformScreenToRawGraph(const QPointF &coordScreen, QPointF &coordGraph) const
Transform from cartesian pixel screen coordinates to cartesian/polar graph coordinates.
bool transformIsDefined() const
Transform is defined when at least three axis points have been digitized.