diff options
author | Dimitrios Apostolou <jimis@qt.io> | 2021-05-20 21:59:20 +0200 |
---|---|---|
committer | Dimitrios Apostolou <jimis@qt.io> | 2021-05-21 15:26:10 +0200 |
commit | 0d1f32381d70f0f551fd3a02040650938cd8ac6d (patch) | |
tree | 703f3dd0474b4bd5a49e0cc7e99e73853e817204 | |
parent | afe2683066ab3bb68f0bb22b2a125da2af3447af (diff) |
Replace code with simpler but equivalent code
The if-branching is unnecessary because
ceil(a-b) == -floor(b-a)
Also add comments to clarify subtle differences in seemingly
identical code snippets.
Change-Id: Idfd72e4aecf53805183f5b2741336d805fbfbb6a
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io>
-rw-r--r-- | src/charts/axis/cartesianchartaxis.cpp | 23 | ||||
-rw-r--r-- | src/charts/axis/chartaxiselement.cpp | 16 | ||||
-rw-r--r-- | src/charts/axis/valueaxis/chartvalueaxisx.cpp | 10 | ||||
-rw-r--r-- | src/charts/axis/valueaxis/chartvalueaxisy.cpp | 11 |
4 files changed, 27 insertions, 33 deletions
diff --git a/src/charts/axis/cartesianchartaxis.cpp b/src/charts/axis/cartesianchartaxis.cpp index 4941bc23..62de5906 100644 --- a/src/charts/axis/cartesianchartaxis.cpp +++ b/src/charts/axis/cartesianchartaxis.cpp @@ -132,15 +132,16 @@ void CartesianChartAxis::updateMinorTickItems() expectedCount = qMax(expectedCount, 0); } else { const qreal interval = valueAxis->tickInterval(); - qreal firstMajorTick = valueAxis->tickAnchor(); + const qreal anchor = valueAxis->tickAnchor(); const qreal max = valueAxis->max(); const qreal min = valueAxis->min(); const int _minorTickCount = valueAxis->minorTickCount(); - if (min < firstMajorTick) - firstMajorTick = firstMajorTick - std::ceil((firstMajorTick - min) / interval) * interval; - else - firstMajorTick = firstMajorTick + std::floor((min - firstMajorTick) / interval) * interval; + // Find the closest major tick <= the min of the range, even if it's not drawn! + // This is where we'll start counting minor ticks from, because minor ticks + // might need to be drawn even before the first major tick. + const qreal ticksFromAnchor = (anchor - min) / interval; + const qreal firstMajorTick = anchor - std::ceil(ticksFromAnchor) * interval; const qreal deltaMinor = interval / qreal(_minorTickCount + 1); qreal minorTick = firstMajorTick + deltaMinor; @@ -374,16 +375,16 @@ void CartesianChartAxis::updateLabelsValues(QValueAxis *axis) static_cast<ValueAxisLabel *>(labelItems().at(i))->setValue(value); } } else { - qreal value = axis->tickAnchor(); - if (value > min()) - value = value - std::floor((value - min()) / axis->tickInterval()) * axis->tickInterval(); - else - value = value + std::ceil((min() - value) / axis->tickInterval()) * axis->tickInterval(); + const qreal anchor = axis->tickAnchor(); + const qreal interval = axis->tickInterval(); + const qreal ticksFromAnchor = (anchor - min()) / interval; + const qreal firstMajorTick = anchor - std::floor(ticksFromAnchor) * interval; int i = axis->isReverse() ? labelItems().count()-1 : 0; + qreal value = firstMajorTick; while (value <= max()) { static_cast<ValueAxisLabel *>(labelItems().at(i))->setValue(value); - value += axis->tickInterval(); + value += interval; i += axis->isReverse() ? -1 : 1; } } diff --git a/src/charts/axis/chartaxiselement.cpp b/src/charts/axis/chartaxiselement.cpp index b17f5cdb..d036041c 100644 --- a/src/charts/axis/chartaxiselement.cpp +++ b/src/charts/axis/chartaxiselement.cpp @@ -430,12 +430,10 @@ QStringList ChartAxisElement::createValueLabels(qreal min, qreal max, int ticks, labels << presenter()->numberToString(value, 'f', n); } } else { - qreal value = tickAnchor; - if (value > min) - value = value - std::floor((value - min) / tickInterval) * tickInterval; - else - value = value + std::ceil((min - value) / tickInterval) * tickInterval; + const qreal ticksFromAnchor = (tickAnchor - min) / tickInterval; + const qreal firstMajorTick = tickAnchor - std::floor(ticksFromAnchor) * tickInterval; + qreal value = firstMajorTick; while (value <= max) { labels << presenter()->numberToString(value, 'f', n); value += tickInterval; @@ -472,12 +470,10 @@ QStringList ChartAxisElement::createValueLabels(qreal min, qreal max, int ticks, labels << formatLabel(formatSpec, array, value, precision, preStr, postStr); } } else { - qreal value = tickAnchor; - if (value > min) - value = value - std::floor((value - min) / tickInterval) * tickInterval; - else - value = value + std::ceil((min - value) / tickInterval) * tickInterval; + const qreal ticksFromAnchor = (tickAnchor - min) / tickInterval; + const qreal firstMajorTick = tickAnchor - std::floor(ticksFromAnchor) * tickInterval; + qreal value = firstMajorTick; while (value <= max) { labels << formatLabel(formatSpec, array, value, precision, preStr, postStr); value += tickInterval; diff --git a/src/charts/axis/valueaxis/chartvalueaxisx.cpp b/src/charts/axis/valueaxis/chartvalueaxisx.cpp index 8c937bff..bd9be1aa 100644 --- a/src/charts/axis/valueaxis/chartvalueaxisx.cpp +++ b/src/charts/axis/valueaxis/chartvalueaxisx.cpp @@ -78,19 +78,17 @@ QList<qreal> ChartValueAxisX::calculateLayout() const const qreal anchor = m_axis->tickAnchor(); const qreal maxValue = max(); const qreal minValue = min(); - qreal value; - // Find the first major tick right after the min of range - if (anchor > minValue) - value = anchor - std::floor((anchor - minValue) / interval) * interval; - else - value = anchor + std::ceil((minValue - anchor) / interval) * interval; + // Find the first major tick right after the min of the range + const qreal ticksFromAnchor = (anchor - minValue) / interval; + const qreal firstMajorTick = anchor - std::floor(ticksFromAnchor) * interval; const QRectF &gridRect = gridGeometry(); const qreal deltaX = gridRect.width() / (maxValue - minValue); QList<qreal> points; const qreal leftPos = gridRect.left(); + qreal value = firstMajorTick; while (value <= maxValue) { points << (value - minValue) * deltaX + leftPos; value += interval; diff --git a/src/charts/axis/valueaxis/chartvalueaxisy.cpp b/src/charts/axis/valueaxis/chartvalueaxisy.cpp index 50ecf322..1b48e446 100644 --- a/src/charts/axis/valueaxis/chartvalueaxisy.cpp +++ b/src/charts/axis/valueaxis/chartvalueaxisy.cpp @@ -74,21 +74,20 @@ QList<qreal> ChartValueAxisY::calculateLayout() const return points; } else { const qreal interval = m_axis->tickInterval(); - qreal value = m_axis->tickAnchor(); + const qreal anchor = m_axis->tickAnchor(); const qreal maxValue = max(); const qreal minValue = min(); - // Find the first major tick right after the min of range - if (value > minValue) - value = value - std::floor((value - minValue) / interval) * interval; - else - value = value + std::ceil((minValue - value) / interval) * interval; + // Find the first major tick right after the min of the range + const qreal ticksFromAnchor = (anchor - minValue) / interval; + const qreal firstMajorTick = anchor - std::floor(ticksFromAnchor) * interval; const QRectF &gridRect = gridGeometry(); const qreal deltaY = gridRect.height() / (maxValue - minValue); QList<qreal> points; const qreal bottomPos = gridRect.bottom(); + qreal value = firstMajorTick; while (value <= maxValue) { points << (value - minValue) * -deltaY + bottomPos; value += interval; |