diff options
Diffstat (limited to 'src/datavisualization/axis/qvalue3daxisformatter.cpp')
-rw-r--r-- | src/datavisualization/axis/qvalue3daxisformatter.cpp | 66 |
1 files changed, 39 insertions, 27 deletions
diff --git a/src/datavisualization/axis/qvalue3daxisformatter.cpp b/src/datavisualization/axis/qvalue3daxisformatter.cpp index b1183023..7c7db398 100644 --- a/src/datavisualization/axis/qvalue3daxisformatter.cpp +++ b/src/datavisualization/axis/qvalue3daxisformatter.cpp @@ -104,11 +104,11 @@ QValue3DAxisFormatter *QValue3DAxisFormatter::createNewInstance() const } /*! - * This method populates the label and grid line position arrays, as well as calculates - * any values needed for mapping between value and position. It is allowed to access + * This method populates the label and grid line position arrays and the label value array, as well + * as calculates any values needed for mapping between value and position. It is allowed to access * the parent axis from inside this function. * - * This method must be reimplemented in a subclass. The resetPositionArrays() method must be called + * This method must be reimplemented in a subclass. The resetArrays() method must be called * in the subclass implementation before the position arrays are recalculated. If the subclass * implementation changes any parent axis values, these changes must be done before * the resetPositionArrays() call. @@ -116,7 +116,7 @@ QValue3DAxisFormatter *QValue3DAxisFormatter::createNewInstance() const * See gridPositions(), subGridPositions(), and labelPositions() documentation about the arrays * that need to be populated. * - * \sa gridPositions(), subGridPositions(), labelPositions(), axis(), resetPositionArrays() + * \sa gridPositions(), subGridPositions(), labelPositions(), axis(), resetArrays() */ void QValue3DAxisFormatter::recalculate() { @@ -145,7 +145,7 @@ QString QValue3DAxisFormatter::labelForIndex(int index) const * * \sa recalculate(), labelForIndex(), QValue3DAxis::labelFormat */ -QString QValue3DAxisFormatter::stringForValue(float value, const QString &format) const +QString QValue3DAxisFormatter::stringForValue(qreal value, const QString &format) const { return d_ptr->stringForValue(value, format); } @@ -199,9 +199,9 @@ void QValue3DAxisFormatter::populateCopy(QValue3DAxisFormatter ©) const * * \sa gridPositions(), subGridPositions(), labelPositions(), axis(), recalculate() */ -void QValue3DAxisFormatter::resetPositionArrays() +void QValue3DAxisFormatter::resetArrays() { - d_ptr->resetPositionArrays(); + d_ptr->resetArrays(); } /*! @@ -227,7 +227,7 @@ QValue3DAxis *QValue3DAxisFormatter::axis() const } /*! - * \return a reference to the array of normalized grid positions. + * \return a reference to the array of normalized grid line positions. * The array size is equal to the segment count of the parent axis plus one. * The values should be between 0.0 (for minimum value) and 1.0 (for maximum value), inclusive. * The grid line at the index zero corresponds to the minimum value of the axis. @@ -240,14 +240,14 @@ QVector<float> &QValue3DAxisFormatter::gridPositions() const } /*! - * \return a reference to the array of normalized subgrid positions. + * \return a reference to the array of normalized subgrid line positions. * The array size is equal to segment count of the parent axis times sub-segment count of the parent * axis minus one. * The values should be between 0.0 (for minimum value) and 1.0 (for maximum value), inclusive. * * \sa QValue3DAxis::segmentCount, QValue3DAxis::subSegmentCount */ -QVector<QVector<float> > &QValue3DAxisFormatter::subGridPositions() const +QVector<float> &QValue3DAxisFormatter::subGridPositions() const { return d_ptr->m_subGridPositions; } @@ -265,6 +265,18 @@ QVector<float> &QValue3DAxisFormatter::labelPositions() const return d_ptr->m_labelPositions; } +/*! + * \return a reference to the array of values used to generate label strings. + * The array size is equal to the size of the label positions array and + * the indexes correspond to that array as well. + * + * \sa labelPositions() + */ +QVector<qreal> &QValue3DAxisFormatter::labelValues() const +{ + return d_ptr->m_labelValues; +} + // QValue3DAxisFormatterPrivate QValue3DAxisFormatterPrivate::QValue3DAxisFormatterPrivate(QValue3DAxisFormatter *q) : QObject(0), @@ -298,24 +310,27 @@ void QValue3DAxisFormatterPrivate::recalculate() void QValue3DAxisFormatterPrivate::doRecalculate() { - resetPositionArrays(); + resetArrays(); int segmentCount = m_axis->segmentCount(); int subGridCount = m_axis->subSegmentCount() - 1; - float segmentStep = 1.0f / float(segmentCount); - float subSegmentStep = 0; + // Use qreals for intermediate calculations for better accuracy on label values + qreal segmentStep = 1.0 / qreal(segmentCount); + qreal subSegmentStep = 0; if (subGridCount > 0) - subSegmentStep = segmentStep / float(subGridCount + 1); + subSegmentStep = segmentStep / qreal(subGridCount + 1); // Calculate positions + qreal rangeNormalizer = qreal(m_max - m_min); for (int i = 0; i < segmentCount; i++) { - float gridValue = segmentStep * i; - m_gridPositions[i] = gridValue; - m_labelPositions[i] = gridValue; + qreal gridValue = segmentStep * qreal(i); + m_gridPositions[i] = float(gridValue); + m_labelPositions[i] = float(gridValue); + m_labelValues[i] = gridValue * rangeNormalizer + qreal(m_min); if (m_subGridPositions.size()) { for (int j = 0; j < subGridCount; j++) - m_subGridPositions[i][j] = gridValue + subSegmentStep * (j + 1); + m_subGridPositions[i * subGridCount + j] = gridValue + subSegmentStep * (j + 1); } } @@ -343,10 +358,10 @@ void QValue3DAxisFormatterPrivate::doPopulateCopy(QValue3DAxisFormatterPrivate & QString QValue3DAxisFormatterPrivate::labelForIndex(int index) const { - return q_ptr->stringForValue(q_ptr->valueAt(m_gridPositions.at(index)), m_axis->labelFormat()); + return q_ptr->stringForValue(m_labelValues.at(index), m_axis->labelFormat()); } -QString QValue3DAxisFormatterPrivate::stringForValue(float value, const QString &format) +QString QValue3DAxisFormatterPrivate::stringForValue(qreal value, const QString &format) { if (m_previousLabelFormat.compare(format)) { // Format string different than the previous one used, reparse it @@ -382,24 +397,21 @@ void QValue3DAxisFormatterPrivate::setAxis(QValue3DAxis *axis) m_axis = axis; } -void QValue3DAxisFormatterPrivate::resetPositionArrays() +void QValue3DAxisFormatterPrivate::resetArrays() { m_gridPositions.clear(); m_subGridPositions.clear(); m_labelPositions.clear(); + m_labelValues.clear(); int segmentCount = m_axis->segmentCount(); int subGridCount = m_axis->subSegmentCount() - 1; m_gridPositions.resize(segmentCount + 1); - - if (subGridCount > 0) { - m_subGridPositions.resize(segmentCount); - for (int i = 0; i < segmentCount; i++) - m_subGridPositions[i].resize(subGridCount); - } + m_subGridPositions.resize(segmentCount * subGridCount); m_labelPositions.resize(segmentCount + 1); + m_labelValues.resize(segmentCount + 1); } void QValue3DAxisFormatterPrivate::markDirty(bool labelsChange) |