34 , mNodataValue( nodataValue )
56 int nEntries = mColumns * mRows;
57 mData =
new double[nEntries];
58 memcpy( mData, m.mData,
sizeof(
double ) * nEntries );
75 mData = 0; mColumns = 0; mRows = 0;
81 return twoArgumentOperation(
opPLUS, other );
86 return twoArgumentOperation(
opMINUS, other );
91 return twoArgumentOperation(
opMUL, other );
96 return twoArgumentOperation(
opDIV, other );
101 return twoArgumentOperation(
opPOW, other );
106 return twoArgumentOperation(
opEQ, other );
111 return twoArgumentOperation(
opNE, other );
116 return twoArgumentOperation(
opGT, other );
121 return twoArgumentOperation(
opLT, other );
126 return twoArgumentOperation(
opGE, other );
131 return twoArgumentOperation(
opLE, other );
136 return twoArgumentOperation(
opAND, other );
141 return twoArgumentOperation(
opOR, other );
146 return oneArgumentOperation(
opSQRT );
151 return oneArgumentOperation(
opSIN );
156 return oneArgumentOperation(
opASIN );
161 return oneArgumentOperation(
opCOS );
166 return oneArgumentOperation(
opACOS );
171 return oneArgumentOperation(
opTAN );
176 return oneArgumentOperation(
opATAN );
181 return oneArgumentOperation(
opSIGN );
186 return oneArgumentOperation(
opLOG );
191 return oneArgumentOperation(
opLOG10 );
194 bool QgsRasterMatrix::oneArgumentOperation( OneArgOperator op )
201 int nEntries = mColumns * mRows;
203 for (
int i = 0; i < nEntries; ++i )
206 if ( value != mNodataValue )
213 mData[i] = mNodataValue;
217 mData[i] = sqrt( value );
221 mData[i] = sin( value );
224 mData[i] = cos( value );
227 mData[i] = tan( value );
230 mData[i] = asin( value );
233 mData[i] = acos( value );
236 mData[i] = atan( value );
244 mData[i] = mNodataValue;
248 mData[i] =
::log( value );
254 mData[i] = mNodataValue;
267 double QgsRasterMatrix::calculateTwoArgumentOp( TwoArgOperator op,
double arg1,
double arg2 )
const
287 if ( !testPowerValidity( arg1, arg2 ) )
293 return qPow( arg1, arg2 );
296 return ( arg1 == arg2 ? 1.0 : 0.0 );
298 return ( arg1 == arg2 ? 0.0 : 1.0 );
300 return ( arg1 > arg2 ? 1.0 : 0.0 );
302 return ( arg1 < arg2 ? 1.0 : 0.0 );
304 return ( arg1 >= arg2 ? 1.0 : 0.0 );
306 return ( arg1 <= arg2 ? 1.0 : 0.0 );
308 return ( arg1 && arg2 ? 1.0 : 0.0 );
310 return ( arg1 || arg2 ? 1.0 : 0.0 );
315 bool QgsRasterMatrix::twoArgumentOperation( TwoArgOperator op,
const QgsRasterMatrix& other )
322 mData[0] = mNodataValue;
326 mData[0] = calculateTwoArgumentOp( op, mData[0], other.
number() );
334 double* matrix = other.mData;
335 int nEntries = mColumns * mRows;
336 double value1, value2;
338 for (
int i = 0; i < nEntries; ++i )
340 value1 = mData[i]; value2 = matrix[i];
341 if ( value1 == mNodataValue || value2 == other.mNodataValue )
343 mData[i] = mNodataValue;
347 mData[i] = calculateTwoArgumentOp( op, value1, value2 );
356 double* matrix = other.mData;
358 double value = mData[0];
360 mData =
new double[nEntries]; mColumns = other.
nColumns(); mRows = other.
nRows();
363 if ( value == mNodataValue )
365 for (
int i = 0; i < nEntries; ++i )
367 mData[i] = mNodataValue;
372 for (
int i = 0; i < nEntries; ++i )
374 if ( matrix[i] == other.mNodataValue )
376 mData[i] = mNodataValue;
380 mData[i] = calculateTwoArgumentOp( op, value, matrix[i] );
386 double value = other.
number();
387 int nEntries = mColumns * mRows;
389 if ( other.
number() == other.mNodataValue )
391 for (
int i = 0; i < nEntries; ++i )
393 mData[i] = mNodataValue;
398 for (
int i = 0; i < nEntries; ++i )
400 if ( mData[i] == mNodataValue )
405 mData[i] = calculateTwoArgumentOp( op, mData[i], value );
411 bool QgsRasterMatrix::testPowerValidity(
double base,
double power )
const
413 if (( base == 0 && power < 0 ) || ( base < 0 && ( power - floor( power ) ) > 0 ) )
double * takeData()
Returns data and ownership.
QgsRasterMatrix & operator=(const QgsRasterMatrix &m)
bool add(const QgsRasterMatrix &other)
Adds another matrix to this one.
bool power(const QgsRasterMatrix &other)
QgsRasterMatrix()
Takes ownership of data array.
bool greaterThan(const QgsRasterMatrix &other)
bool notEqual(const QgsRasterMatrix &other)
bool equal(const QgsRasterMatrix &other)
bool logicalOr(const QgsRasterMatrix &other)
void setData(int cols, int rows, double *data, double nodataValue)
bool subtract(const QgsRasterMatrix &other)
Subtracts another matrix from this one.
bool multiply(const QgsRasterMatrix &other)
bool isNumber() const
Returns true if matrix is 1x1 (=scalar number)
bool lesserEqual(const QgsRasterMatrix &other)
bool divide(const QgsRasterMatrix &other)
double ANALYSIS_EXPORT power(double a, int b)
power function for integer coefficients
double nodataValue() const
bool greaterEqual(const QgsRasterMatrix &other)
double * data()
Returns data array (but not ownership)
bool lesserThan(const QgsRasterMatrix &other)
bool logicalAnd(const QgsRasterMatrix &other)