49 const int nEntries = mColumns * mRows;
50 mData =
new double[nEntries];
51 memcpy( mData, m.mData,
sizeof(
double ) * nEntries );
77 return twoArgumentOperation(
opPLUS, other );
82 return twoArgumentOperation(
opMINUS, other );
87 return twoArgumentOperation(
opMUL, other );
92 return twoArgumentOperation(
opDIV, other );
97 return twoArgumentOperation(
opPOW, other );
102 return twoArgumentOperation(
opEQ, other );
107 return twoArgumentOperation(
opNE, other );
112 return twoArgumentOperation(
opGT, other );
117 return twoArgumentOperation(
opLT, other );
122 return twoArgumentOperation(
opGE, other );
127 return twoArgumentOperation(
opLE, other );
132 return twoArgumentOperation(
opAND, other );
137 return twoArgumentOperation(
opOR, other );
142 return twoArgumentOperation(
opMAX, other );
147 return twoArgumentOperation(
opMIN, other );
152 return oneArgumentOperation(
opSQRT );
157 return oneArgumentOperation(
opSIN );
162 return oneArgumentOperation(
opASIN );
167 return oneArgumentOperation(
opCOS );
172 return oneArgumentOperation(
opACOS );
177 return oneArgumentOperation(
opTAN );
182 return oneArgumentOperation(
opATAN );
187 return oneArgumentOperation(
opSIGN );
192 return oneArgumentOperation(
opLOG );
197 return oneArgumentOperation(
opLOG10 );
202 return oneArgumentOperation(
opABS );
205bool QgsRasterMatrix::oneArgumentOperation( OneArgOperator op )
212 const int nEntries = mColumns * mRows;
214 for (
int i = 0; i < nEntries; ++i )
217 if ( value != mNodataValue )
224 mData[i] = mNodataValue;
228 mData[i] = std::sqrt( value );
232 mData[i] = std::sin( value );
235 mData[i] = std::cos( value );
238 mData[i] = std::tan( value );
241 mData[i] = std::asin( value );
244 mData[i] = std::acos( value );
247 mData[i] = std::atan( value );
255 mData[i] = mNodataValue;
259 mData[i] =
::log( value );
265 mData[i] = mNodataValue;
273 mData[i] = ::fabs( value );
281double QgsRasterMatrix::calculateTwoArgumentOp( TwoArgOperator op,
double arg1,
double arg2 )
const
301 if ( !testPowerValidity( arg1, arg2 ) )
307 return std::pow( arg1, arg2 );
310 return ( arg1 == arg2 ? 1.0 : 0.0 );
312 return ( arg1 == arg2 ? 0.0 : 1.0 );
314 return ( arg1 > arg2 ? 1.0 : 0.0 );
316 return ( arg1 < arg2 ? 1.0 : 0.0 );
318 return ( arg1 >= arg2 ? 1.0 : 0.0 );
320 return ( arg1 <= arg2 ? 1.0 : 0.0 );
322 return ( arg1 && arg2 ? 1.0 : 0.0 );
324 return ( arg1 || arg2 ? 1.0 : 0.0 );
326 return std::max( arg1, arg2 );
328 return std::min( arg1, arg2 );
333bool QgsRasterMatrix::twoArgumentOperation( TwoArgOperator op,
const QgsRasterMatrix &other )
340 mData[0] = mNodataValue;
344 mData[0] = calculateTwoArgumentOp( op, mData[0], other.
number() );
352 double *matrix = other.mData;
353 const int nEntries = mColumns * mRows;
354 double value1, value2;
356 for (
int i = 0; i < nEntries; ++i )
360 if ( value1 == mNodataValue || value2 == other.mNodataValue )
362 mData[i] = mNodataValue;
366 mData[i] = calculateTwoArgumentOp( op, value1, value2 );
375 double *matrix = other.mData;
377 const double value = mData[0];
379 mData =
new double[nEntries];
381 mRows = other.
nRows();
384 if ( value == mNodataValue )
386 for (
int i = 0; i < nEntries; ++i )
388 mData[i] = mNodataValue;
393 for (
int i = 0; i < nEntries; ++i )
395 if ( matrix[i] == other.mNodataValue )
397 mData[i] = mNodataValue;
401 mData[i] = calculateTwoArgumentOp( op, value, matrix[i] );
407 const double value = other.
number();
408 const int nEntries = mColumns * mRows;
410 if ( other.
number() == other.mNodataValue )
412 for (
int i = 0; i < nEntries; ++i )
414 mData[i] = mNodataValue;
419 for (
int i = 0; i < nEntries; ++i )
421 if ( mData[i] == mNodataValue )
426 mData[i] = calculateTwoArgumentOp( op, mData[i], value );
432bool QgsRasterMatrix::testPowerValidity(
double base,
double power )
const
434 return !( ( base == 0 &&
power < 0 ) || ( base < 0 && (
power - std::floor(
power ) ) > 0 ) );
Represents a matrix in a raster calculator operation.
bool equal(const QgsRasterMatrix &other)
bool max(const QgsRasterMatrix &other)
Calculates the maximum value between two matrices.
bool greaterEqual(const QgsRasterMatrix &other)
double * takeData()
Returns data and ownership.
bool notEqual(const QgsRasterMatrix &other)
bool greaterThan(const QgsRasterMatrix &other)
QgsRasterMatrix()=default
bool logicalOr(const QgsRasterMatrix &other)
bool lesserEqual(const QgsRasterMatrix &other)
bool absoluteValue()
Calculates the absolute value.
bool logicalAnd(const QgsRasterMatrix &other)
bool isNumber() const
Returns true if matrix is 1x1 (=scalar number).
bool lesserThan(const QgsRasterMatrix &other)
bool add(const QgsRasterMatrix &other)
Adds another matrix to this one.
bool multiply(const QgsRasterMatrix &other)
QgsRasterMatrix & operator=(const QgsRasterMatrix &m)
double * data()
Returns data array (but not ownership).
bool power(const QgsRasterMatrix &other)
double nodataValue() const
bool min(const QgsRasterMatrix &other)
Calculates the minimum value between two matrices.
bool divide(const QgsRasterMatrix &other)
void setData(int cols, int rows, double *data, double nodataValue)
bool subtract(const QgsRasterMatrix &other)
Subtracts another matrix from this one.