diff options
author | Liang Qi <liang.qi@qt.io> | 2016-11-26 12:53:01 +0100 |
---|---|---|
committer | Liang Qi <liang.qi@qt.io> | 2016-11-26 12:53:01 +0100 |
commit | a78f8d6bef57dd4283094a52551705ee02909970 (patch) | |
tree | a4d42899d2b745a0c3b9d3baa6573c870f8d5328 /src/datavisualization/data/qsurfacedataproxy.cpp | |
parent | 3f5c27908314074f177454ddcb1c18fce123fa6c (diff) | |
parent | 0bf42b29a9fa926e0ec63a33eb496c660960d617 (diff) |
Merge remote-tracking branch 'origin/5.7' into 5.8v5.8.0-rc1v5.8.0
Change-Id: I42fd801107912d52c3e1bcd52d98d4362e2c27ef
Diffstat (limited to 'src/datavisualization/data/qsurfacedataproxy.cpp')
-rw-r--r-- | src/datavisualization/data/qsurfacedataproxy.cpp | 61 |
1 files changed, 51 insertions, 10 deletions
diff --git a/src/datavisualization/data/qsurfacedataproxy.cpp b/src/datavisualization/data/qsurfacedataproxy.cpp index c983ead7..fa7990b1 100644 --- a/src/datavisualization/data/qsurfacedataproxy.cpp +++ b/src/datavisualization/data/qsurfacedataproxy.cpp @@ -29,6 +29,7 @@ #include "qsurfacedataproxy_p.h" #include "qsurface3dseries_p.h" +#include "qabstract3daxis_p.h" QT_BEGIN_NAMESPACE_DATAVISUALIZATION @@ -504,7 +505,9 @@ QSurfaceDataProxy *QSurfaceDataProxyPrivate::qptr() return static_cast<QSurfaceDataProxy *>(q_ptr); } -void QSurfaceDataProxyPrivate::limitValues(QVector3D &minValues, QVector3D &maxValues) const +void QSurfaceDataProxyPrivate::limitValues(QVector3D &minValues, QVector3D &maxValues, + QAbstract3DAxis *axisX, QAbstract3DAxis *axisY, + QAbstract3DAxis *axisZ) const { float min = 0.0f; float max = 0.0f; @@ -524,7 +527,9 @@ void QSurfaceDataProxyPrivate::limitValues(QVector3D &minValues, QVector3D &maxV if (row) { for (int j = 0; j < columns; j++) { float itemValue = m_dataArray->at(i)->at(j).y(); - if (min > itemValue) + if (qIsNaN(itemValue) || qIsInf(itemValue)) + continue; + if (min > itemValue && isValidValue(itemValue, axisY)) min = itemValue; if (max < itemValue) max = itemValue; @@ -534,23 +539,59 @@ void QSurfaceDataProxyPrivate::limitValues(QVector3D &minValues, QVector3D &maxV minValues.setY(min); maxValues.setY(max); + if (columns) { + // Have some defaults float xLow = m_dataArray->at(0)->at(0).x(); float xHigh = m_dataArray->at(0)->last().x(); float zLow = m_dataArray->at(0)->at(0).z(); float zHigh = m_dataArray->last()->at(0).z(); - minValues.setX(qMin(xLow, xHigh)); - minValues.setZ(qMin(zLow, zHigh)); - maxValues.setX(qMax(xLow, xHigh)); - maxValues.setZ(qMax(zLow, zHigh)); + for (int i = 0; i < columns; i++) { + float zItemValue = m_dataArray->at(0)->at(i).z(); + if (qIsNaN(zItemValue) || qIsInf(zItemValue)) + continue; + else if (isValidValue(zItemValue, axisZ)) + zLow = qMin(zLow,zItemValue); + } + for (int i = 0; i < columns; i++) { + float zItemValue = m_dataArray->last()->at(i).z(); + if (qIsNaN(zItemValue) || qIsInf(zItemValue)) + continue; + else if (isValidValue(zItemValue, axisZ)) + zHigh = qMax(zHigh, zItemValue); + } + for (int i = 0; i < rows; i++) { + float xItemValue = m_dataArray->at(i)->at(0).x(); + if (qIsNaN(xItemValue) || qIsInf(xItemValue)) + continue; + else if (isValidValue(xItemValue, axisX)) + xLow = qMin(xLow, xItemValue); + } + for (int i = 0; i < rows; i++) { + float xItemValue = m_dataArray->at(i)->last().x(); + if (qIsNaN(xItemValue) || qIsInf(xItemValue)) + continue; + else if (isValidValue(xItemValue, axisX)) + xHigh = qMax(xHigh, xItemValue); + } + minValues.setX(xLow); + minValues.setZ(zLow); + maxValues.setX(xHigh); + maxValues.setZ(zHigh); } else { - minValues.setX(0.0f); - minValues.setZ(0.0f); - maxValues.setX(0.0f); - maxValues.setZ(0.0f); + minValues.setX(axisX->d_ptr->allowZero() ? 0.0f : 1.0f); + minValues.setZ(axisZ->d_ptr->allowZero() ? 0.0f : 1.0f); + maxValues.setX(axisX->d_ptr->allowZero() ? 0.0f : 1.0f); + maxValues.setZ(axisZ->d_ptr->allowZero() ? 0.0f : 1.0f); } } +bool QSurfaceDataProxyPrivate::isValidValue(float value, QAbstract3DAxis *axis) const +{ + return (value > 0.0f || (value == 0.0f && axis->d_ptr->allowZero()) + || (value < 0.0f && axis->d_ptr->allowNegatives())); +} + void QSurfaceDataProxyPrivate::clearRow(int rowIndex) { if (m_dataArray->at(rowIndex)) { |