src/basics.cpp

changeset 1219
8e39b5d7c562
parent 1218
e0b59d183f96
child 1222
34def2630300
equal deleted inserted replaced
1218:e0b59d183f96 1219:8e39b5d7c562
127 if (y() != other.y()) return y() < other.y(); 127 if (y() != other.y()) return y() < other.y();
128 if (z() != other.z()) return z() < other.z(); 128 if (z() != other.z()) return z() < other.z();
129 return false; 129 return false;
130 } 130 }
131 131
132 // ============================================================================= 132 Matrix::Matrix() :
133 // 133 coefficients {1, 0, 0, 0, 1, 0, 0, 0, 1} {}
134 Matrix::Matrix(double vals[]) 134
135 { 135 Matrix::Matrix(std::initializer_list<double> values)
136 for (int i = 0; i < 9; ++i) 136 {
137 m_vals[i] = vals[i]; 137 if (values.size() == 9)
138 } 138 memcpy(&coefficients[0], values.begin(), sizeof coefficients);
139 139 }
140 // ============================================================================= 140
141 //
142 Matrix::Matrix(double fillval)
143 {
144 for (int i = 0; i < 9; ++i)
145 m_vals[i] = fillval;
146 }
147
148 // =============================================================================
149 //
150 Matrix::Matrix(const std::initializer_list<double>& vals)
151 {
152 if (vals.size() == 9)
153 memcpy(&m_vals[0], vals.begin(), sizeof m_vals);
154 }
155
156 // =============================================================================
157 //
158 void Matrix::dump() const
159 {
160 for (int i = 0; i < 3; ++i)
161 {
162 for (int j = 0; j < 3; ++j)
163 print("%1\t", m_vals[i * 3 + j]);
164
165 print("\n");
166 }
167 }
168
169 // =============================================================================
170 //
171 QString Matrix::toString() const 141 QString Matrix::toString() const
172 { 142 {
173 QString val; 143 QString val;
174 144
175 for (int i = 0; i < 9; ++i) 145 for (int i = 0; i < countof(coefficients); ++i)
176 { 146 {
177 if (i > 0) 147 if (i > 0)
178 val += ' '; 148 val += ' ';
179 149
180 val += QString::number(m_vals[i]); 150 val += QString::number(coefficients[i]);
181 } 151 }
182 152
183 return val; 153 return val;
184 } 154 }
185 155
186 // =============================================================================
187 //
188 void Matrix::zero() 156 void Matrix::zero()
189 { 157 {
190 memset(&m_vals[0], 0, sizeof m_vals); 158 for (int i = 0; i < countof(coefficients); ++i)
191 } 159 coefficients[i] = 0;
192 160 }
193 // ============================================================================= 161
194 // 162 Matrix Matrix::operator*(const Matrix& other) const
195 Matrix Matrix::mult(const Matrix& other) const 163 {
196 { 164 Matrix result;
197 Matrix val; 165 result.zero();
198 val.zero();
199 166
200 for (int i = 0; i < 3; ++i) 167 for (int i = 0; i < 3; ++i)
201 for (int j = 0; j < 3; ++j) 168 for (int j = 0; j < 3; ++j)
202 for (int k = 0; k < 3; ++k) 169 for (int k = 0; k < 3; ++k)
203 val[(i * 3) + j] += m_vals[(i * 3) + k] * other[(k * 3) + j]; 170 result(i, j) += (*this)(i, k) * other(k, j);
204 171
205 return val; 172 return result;
206 } 173 }
207 174
208 // ============================================================================= 175 Matrix& Matrix::operator=(const Matrix& other)
209 // 176 {
210 Matrix& Matrix::operator= (const Matrix& other) 177 for (int i = 0; i < countof(coefficients); ++i)
211 { 178 (*this)[i] = other[i];
212 memcpy(&m_vals[0], &other.m_vals[0], sizeof m_vals); 179 return *this;
213 return *this; 180 }
214 } 181
215 182 double Matrix::determinant() const
216 // ============================================================================= 183 {
217 // 184 return
218 double Matrix::getDeterminant() const 185 (*this)(0, 0) * (*this)(1, 1) * (*this)(2, 2) +
219 { 186 (*this)(0, 1) * (*this)(1, 2) * (*this)(2, 0) +
220 return (value(0) * value(4) * value(8)) + 187 (*this)(0, 2) * (*this)(1, 0) * (*this)(2, 1) -
221 (value(1) * value(5) * value(6)) + 188 (*this)(0, 2) * (*this)(1, 1) * (*this)(2, 0) -
222 (value(2) * value(3) * value(7)) - 189 (*this)(0, 1) * (*this)(1, 0) * (*this)(2, 2) -
223 (value(2) * value(4) * value(6)) - 190 (*this)(0, 0) * (*this)(1, 2) * (*this)(2, 1);
224 (value(1) * value(3) * value(8)) - 191 }
225 (value(0) * value(5) * value(7)); 192
226 }
227
228 // =============================================================================
229 //
230 bool Matrix::operator== (const Matrix& other) const 193 bool Matrix::operator== (const Matrix& other) const
231 { 194 {
232 for (int i = 0; i < 9; ++i) 195 for (int i = 0; i < countof(coefficients); ++i)
233 { 196 {
234 if (value(i) != other[i]) 197 if ((*this)[i] != other[i])
235 return false; 198 return false;
236 } 199 }
237 200
238 return true; 201 return true;
239 } 202 }
240 203
241 // =============================================================================
242 //
243 LDBoundingBox::LDBoundingBox() 204 LDBoundingBox::LDBoundingBox()
244 { 205 {
245 reset(); 206 reset();
246 } 207 }
247 208

mercurial