diff options
author | Sami Varanka <sami.varanka@qt.io> | 2021-07-20 12:41:19 +0300 |
---|---|---|
committer | Sami Varanka <sami.varanka@qt.io> | 2021-08-06 09:18:09 +0300 |
commit | 31f23241785f259f9ddb690c7f447725463fc353 (patch) | |
tree | 3ad163af378c26ca1c0c4074da7fd9093b1b82ff /src/datavisualization/data/qsurfacedataproxy.cpp | |
parent | 7d26ac4e42e984ae74e18b107f6d3737b97b5d0c (diff) |
Fix: Nans at surfacedata row/column 0 render fail
If the first or last column or row of the data
given to surfacedataproxy contains NaN values,
the surfacedataproxy might fail to find the
limit values for the axis. Changed limiValues
function in surfacedataproxy so that if it
doesn't find min/max values from the first/last
column/row it continues from the next column/row.
Added a test to verify that the limit values are
found when first/last row contains NaN values.
Fixes: QTBUG-95112
Fixes: QTBUG-95109
Change-Id: I74a343e5bc8cae5b8020243859000fdb5ca7f86e
Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io>
Diffstat (limited to 'src/datavisualization/data/qsurfacedataproxy.cpp')
-rw-r--r-- | src/datavisualization/data/qsurfacedataproxy.cpp | 80 |
1 files changed, 54 insertions, 26 deletions
diff --git a/src/datavisualization/data/qsurfacedataproxy.cpp b/src/datavisualization/data/qsurfacedataproxy.cpp index 7601d021..c9c6425d 100644 --- a/src/datavisualization/data/qsurfacedataproxy.cpp +++ b/src/datavisualization/data/qsurfacedataproxy.cpp @@ -552,9 +552,11 @@ void QSurfaceDataProxyPrivate::limitValues(QVector3D &minValues, QVector3D &maxV float itemValue = m_dataArray->at(i)->at(j).y(); if (qIsNaN(itemValue) || qIsInf(itemValue)) continue; - if (min > itemValue && isValidValue(itemValue, axisY)) + if ((min > itemValue || (qIsNaN(min) || qIsInf(min))) + && isValidValue(itemValue, axisY)) { min = itemValue; - if (max < itemValue) + } + if (max < itemValue || (qIsNaN(max) || qIsInf(max))) max = itemValue; } } @@ -569,33 +571,59 @@ void QSurfaceDataProxyPrivate::limitValues(QVector3D &minValues, QVector3D &maxV 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(); - 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 < rows; i++) { + for (int j = 0; j < columns; j++) { + float zItemValue = m_dataArray->at(i)->at(j).z(); + if (qIsNaN(zItemValue) || qIsInf(zItemValue)) + continue; + else if (isValidValue(zItemValue, axisZ)) + zLow = qMin(zLow,zItemValue); + } + if (!qIsNaN(zLow) && !qIsInf(zLow)) + break; } - 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 = rows - 1; i >= 0; i--) { + for (int j = 0; j < columns; j++) { + float zItemValue = m_dataArray->at(i)->at(j).z(); + if (qIsNaN(zItemValue) || qIsInf(zItemValue)) + continue; + else if (isValidValue(zItemValue, axisZ)) + { + if (!qIsNaN(zHigh) && !qIsInf(zHigh)) + zHigh = qMax(zHigh, zItemValue); + else + zHigh = zItemValue; + } + } + if (!qIsNaN(zHigh) && !qIsInf(zHigh)) + break; } - 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 j = 0; j<columns; j++){ + for (int i = 0; i < rows; i++) { + float xItemValue = m_dataArray->at(i)->at(j).x(); + if (qIsNaN(xItemValue) || qIsInf(xItemValue)) + continue; + else if (isValidValue(xItemValue, axisX)) + xLow = qMin(xLow, xItemValue); + } + if (!qIsNaN(xLow) && !qIsInf(xLow)) + break; } - 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); + for (int j = columns-1; j >= 0; j--){ + for (int i = 0; i < rows; i++) { + float xItemValue = m_dataArray->at(i)->at(j).x(); + if (qIsNaN(xItemValue) || qIsInf(xItemValue)) + continue; + else if (isValidValue(xItemValue, axisX)) + { + if (!qIsNaN(xHigh) && !qIsInf(xHigh)) + xHigh = qMax(xHigh, xItemValue); + else + xHigh = xItemValue; + } + } + if (!qIsNaN(xHigh) && !qIsInf(xHigh)) + break; } minValues.setX(xLow); minValues.setZ(zLow); |