Branch data Line data Source code
1 : : /***************************************************************************
2 : : qgsrastermatrix.h
3 : : -----------------
4 : : begin : 2010-10-23
5 : : copyright : (C) 20010 by Marco Hugentobler
6 : : email : marco dot hugentobler at sourcepole dot ch
7 : : ***************************************************************************/
8 : :
9 : : /***************************************************************************
10 : : * *
11 : : * This program is free software; you can redistribute it and/or modify *
12 : : * it under the terms of the GNU General Public License as published by *
13 : : * the Free Software Foundation; either version 2 of the License, or *
14 : : * (at your option) any later version. *
15 : : * *
16 : : ***************************************************************************/
17 : :
18 : : #ifndef QGSRASTERMATRIX_H
19 : : #define QGSRASTERMATRIX_H
20 : :
21 : : #include "qgis_analysis.h"
22 : : #include "qgis_sip.h"
23 : :
24 : : /**
25 : : * \ingroup analysis
26 : : * \class QgsRasterMatrix
27 : : * \brief Represents a matrix in a raster calculator operation.
28 : : */
29 : : class ANALYSIS_EXPORT QgsRasterMatrix
30 : : {
31 : : public:
32 : :
33 : : enum TwoArgOperator
34 : : {
35 : : opPLUS,
36 : : opMINUS,
37 : : opMUL,
38 : : opDIV,
39 : : opPOW,
40 : : opEQ, // =
41 : : opNE, // != resp. <>
42 : : opGT, // >
43 : : opLT, // <
44 : : opGE, // >=
45 : : opLE, // <=
46 : : opAND,
47 : : opOR,
48 : : opMIN,
49 : : opMAX
50 : : };
51 : :
52 : : enum OneArgOperator
53 : : {
54 : : opSQRT,
55 : : opSIN,
56 : : opCOS,
57 : : opTAN,
58 : : opASIN,
59 : : opACOS,
60 : : opATAN,
61 : : opSIGN,
62 : : opLOG,
63 : : opLOG10,
64 : : opABS,
65 : : };
66 : :
67 : : //! Takes ownership of data array
68 : 0 : QgsRasterMatrix() = default;
69 : :
70 : : //! \note note available in Python bindings
71 : : QgsRasterMatrix( int nCols, int nRows, double *data, double nodataValue ) SIP_SKIP;
72 : : QgsRasterMatrix( const QgsRasterMatrix &m );
73 : : ~QgsRasterMatrix();
74 : :
75 : : //! Returns TRUE if matrix is 1x1 (=scalar number)
76 : 0 : bool isNumber() const { return ( mColumns == 1 && mRows == 1 ); }
77 : 0 : double number() const { return mData[0]; }
78 : :
79 : : /**
80 : : * Returns data array (but not ownership)
81 : : * \note not available in Python bindings
82 : : */
83 : 0 : double *data() { return mData; } SIP_SKIP
84 : :
85 : : /**
86 : : * Returns data and ownership. Sets data and nrows, ncols of this matrix to 0
87 : : * \note not available in Python bindings
88 : : */
89 : : double *takeData() SIP_SKIP;
90 : :
91 : : void setData( int cols, int rows, double *data, double nodataValue );
92 : :
93 : 0 : int nColumns() const { return mColumns; }
94 : 0 : int nRows() const { return mRows; }
95 : :
96 : 0 : double nodataValue() const { return mNodataValue; }
97 : 0 : void setNodataValue( double d ) { mNodataValue = d; }
98 : :
99 : : QgsRasterMatrix &operator=( const QgsRasterMatrix &m );
100 : : //! Adds another matrix to this one
101 : : bool add( const QgsRasterMatrix &other );
102 : : //! Subtracts another matrix from this one
103 : : bool subtract( const QgsRasterMatrix &other );
104 : : bool multiply( const QgsRasterMatrix &other );
105 : : bool divide( const QgsRasterMatrix &other );
106 : : bool power( const QgsRasterMatrix &other );
107 : : bool equal( const QgsRasterMatrix &other );
108 : : bool notEqual( const QgsRasterMatrix &other );
109 : : bool greaterThan( const QgsRasterMatrix &other );
110 : : bool lesserThan( const QgsRasterMatrix &other );
111 : : bool greaterEqual( const QgsRasterMatrix &other );
112 : : bool lesserEqual( const QgsRasterMatrix &other );
113 : : bool logicalAnd( const QgsRasterMatrix &other );
114 : : bool logicalOr( const QgsRasterMatrix &other );
115 : :
116 : : /**
117 : : * Calculates the maximum value between two matrices
118 : : * \return TRUE on success
119 : : * \since QGIS 3.10
120 : : */
121 : : bool max( const QgsRasterMatrix &other );
122 : :
123 : : /**
124 : : * Calculates the minimum value between two matrices
125 : : * \return TRUE on success
126 : : * \since QGIS 3.10
127 : : */
128 : : bool min( const QgsRasterMatrix &other );
129 : :
130 : : bool squareRoot();
131 : : bool sinus();
132 : : bool asinus();
133 : : bool cosinus();
134 : : bool acosinus();
135 : : bool tangens();
136 : : bool atangens();
137 : : bool changeSign();
138 : : bool log();
139 : : bool log10();
140 : :
141 : : /**
142 : : * Calculates the absolute value
143 : : * \return TRUE on success
144 : : * \since QGIS 3.10
145 : : */
146 : : bool absoluteValue();
147 : :
148 : : private:
149 : 0 : int mColumns = 0;
150 : 0 : int mRows = 0;
151 : 0 : double *mData = nullptr;
152 : 0 : double mNodataValue = -1;
153 : :
154 : : //! +,-,*,/,^,<,>,<=,>=,=,!=, and, or
155 : : bool twoArgumentOperation( TwoArgOperator op, const QgsRasterMatrix &other );
156 : : double calculateTwoArgumentOp( TwoArgOperator op, double arg1, double arg2 ) const;
157 : :
158 : : /*sqrt, std::sin, std::cos, tan, asin, acos, atan*/
159 : : bool oneArgumentOperation( OneArgOperator op );
160 : : bool testPowerValidity( double base, double power ) const;
161 : : };
162 : :
163 : : #endif // QGSRASTERMATRIX_H
|