# | Line 47 | Line 47 | |
---|---|---|
47 | */ | |
48 | #ifndef MATH_SQUAREMATRIX3_HPP | |
49 | #define MATH_SQUAREMATRIX3_HPP | |
50 | < | |
50 | > | #include <vector> |
51 | #include "Quaternion.hpp" | |
52 | #include "SquareMatrix.hpp" | |
53 | #include "Vector3.hpp" | |
# | Line 322 | Line 322 | namespace oopse { | |
322 | if (fabs(det) <= oopse::epsilon) { | |
323 | //"The method was called on a matrix with |determinant| <= 1e-6.", | |
324 | //"This is a runtime or a programming error in your application."); | |
325 | < | } |
326 | < | |
327 | < | m(0, 0) = this->data_[1][1]*this->data_[2][2] - this->data_[1][2]*this->data_[2][1]; |
328 | < | m(1, 0) = this->data_[1][2]*this->data_[2][0] - this->data_[1][0]*this->data_[2][2]; |
329 | < | m(2, 0) = this->data_[1][0]*this->data_[2][1] - this->data_[1][1]*this->data_[2][0]; |
330 | < | m(0, 1) = this->data_[2][1]*this->data_[0][2] - this->data_[2][2]*this->data_[0][1]; |
331 | < | m(1, 1) = this->data_[2][2]*this->data_[0][0] - this->data_[2][0]*this->data_[0][2]; |
332 | < | m(2, 1) = this->data_[2][0]*this->data_[0][1] - this->data_[2][1]*this->data_[0][0]; |
333 | < | m(0, 2) = this->data_[0][1]*this->data_[1][2] - this->data_[0][2]*this->data_[1][1]; |
334 | < | m(1, 2) = this->data_[0][2]*this->data_[1][0] - this->data_[0][0]*this->data_[1][2]; |
335 | < | m(2, 2) = this->data_[0][0]*this->data_[1][1] - this->data_[0][1]*this->data_[1][0]; |
325 | > | std::vector<int> zeroDiagElementIndex; |
326 | > | for (int i =0; i < 3; ++i) { |
327 | > | if (fabs(this->data_[i][i]) <= oopse::epsilon) { |
328 | > | zeroDiagElementIndex.push_back(i); |
329 | > | } |
330 | > | } |
331 | ||
332 | < | m /= det; |
332 | > | if (zeroDiagElementIndex.size() == 2) { |
333 | > | int index = zeroDiagElementIndex[0]; |
334 | > | m(index, index) = 1.0 / this->data_[index][index]; |
335 | > | }else if (zeroDiagElementIndex.size() == 1) { |
336 | > | |
337 | > | int a = (zeroDiagElementIndex[0] + 1) % 3; |
338 | > | int b = (zeroDiagElementIndex[0] + 2) %3; |
339 | > | double denom = this->data_[a][a] * this->data_[b][b] - this->data_[b][a]*this->data_[a][b]; |
340 | > | m(a, a) = this->data_[b][b] /denom; |
341 | > | m(b, a) = -this->data_[b][a]/denom; |
342 | > | |
343 | > | m(a,b) = -this->data_[a][b]/denom; |
344 | > | m(b, b) = this->data_[a][a]/denom; |
345 | > | |
346 | > | } |
347 | > | |
348 | > | /* |
349 | > | for(std::vector<int>::iterator iter = zeroDiagElementIndex.begin(); iter != zeroDiagElementIndex.end() ++iter) { |
350 | > | if (this->data_[*iter][0] > oopse::epsilon || this->data_[*iter][1] ||this->data_[*iter][2] || |
351 | > | this->data_[0][*iter] > oopse::epsilon || this->data_[1][*iter] ||this->data_[2][*iter] ) { |
352 | > | std::cout << "can not inverse matrix" << std::endl; |
353 | > | } |
354 | > | } |
355 | > | */ |
356 | > | } else { |
357 | > | |
358 | > | m(0, 0) = this->data_[1][1]*this->data_[2][2] - this->data_[1][2]*this->data_[2][1]; |
359 | > | m(1, 0) = this->data_[1][2]*this->data_[2][0] - this->data_[1][0]*this->data_[2][2]; |
360 | > | m(2, 0) = this->data_[1][0]*this->data_[2][1] - this->data_[1][1]*this->data_[2][0]; |
361 | > | m(0, 1) = this->data_[2][1]*this->data_[0][2] - this->data_[2][2]*this->data_[0][1]; |
362 | > | m(1, 1) = this->data_[2][2]*this->data_[0][0] - this->data_[2][0]*this->data_[0][2]; |
363 | > | m(2, 1) = this->data_[2][0]*this->data_[0][1] - this->data_[2][1]*this->data_[0][0]; |
364 | > | m(0, 2) = this->data_[0][1]*this->data_[1][2] - this->data_[0][2]*this->data_[1][1]; |
365 | > | m(1, 2) = this->data_[0][2]*this->data_[1][0] - this->data_[0][0]*this->data_[1][2]; |
366 | > | m(2, 2) = this->data_[0][0]*this->data_[1][1] - this->data_[0][1]*this->data_[1][0]; |
367 | > | |
368 | > | m /= det; |
369 | > | } |
370 | return m; | |
371 | } | |
372 |
– | Removed lines |
+ | Added lines |
< | Changed lines |
> | Changed lines |