| 51 | 
  | 
#include "Quaternion.hpp" | 
| 52 | 
  | 
#include "SquareMatrix.hpp" | 
| 53 | 
  | 
#include "Vector3.hpp" | 
| 54 | 
< | 
 | 
| 54 | 
> | 
#include "utils/NumericConstant.hpp" | 
| 55 | 
  | 
namespace oopse { | 
| 56 | 
  | 
 | 
| 57 | 
  | 
    template<typename Real> | 
| 179 | 
  | 
                Real ad1, ad2, ad3;     | 
| 180 | 
  | 
                t = this->data_[0][0] + this->data_[1][1] + this->data_[2][2] + 1.0; | 
| 181 | 
  | 
 | 
| 182 | 
< | 
                if( t > 0.0 ){ | 
| 182 | 
> | 
                if( t > NumericConstant::epsilon ){ | 
| 183 | 
  | 
 | 
| 184 | 
  | 
                    s = 0.5 / sqrt( t ); | 
| 185 | 
  | 
                    q[0] = 0.25 / s; | 
| 194 | 
  | 
 | 
| 195 | 
  | 
                    if( ad1 >= ad2 && ad1 >= ad3 ){ | 
| 196 | 
  | 
 | 
| 197 | 
< | 
                        s = 2.0 * sqrt( 1.0 + this->data_[0][0] - this->data_[1][1] - this->data_[2][2] ); | 
| 198 | 
< | 
                        q[0] = (this->data_[1][2] + this->data_[2][1]) / s; | 
| 199 | 
< | 
                        q[1] = 0.5 / s; | 
| 200 | 
< | 
                        q[2] = (this->data_[0][1] + this->data_[1][0]) / s; | 
| 201 | 
< | 
                        q[3] = (this->data_[0][2] + this->data_[2][0]) / s; | 
| 197 | 
> | 
                        s = 0.5 / sqrt( 1.0 + this->data_[0][0] - this->data_[1][1] - this->data_[2][2] ); | 
| 198 | 
> | 
                        q[0] = (this->data_[1][2] - this->data_[2][1]) * s; | 
| 199 | 
> | 
                        q[1] = 0.25 / s; | 
| 200 | 
> | 
                        q[2] = (this->data_[0][1] + this->data_[1][0]) * s; | 
| 201 | 
> | 
                        q[3] = (this->data_[0][2] + this->data_[2][0]) * s; | 
| 202 | 
  | 
                    } else if ( ad2 >= ad1 && ad2 >= ad3 ) { | 
| 203 | 
< | 
                        s = sqrt( 1.0 + this->data_[1][1] - this->data_[0][0] - this->data_[2][2] ) * 2.0; | 
| 204 | 
< | 
                        q[0] = (this->data_[0][2] + this->data_[2][0]) / s; | 
| 205 | 
< | 
                        q[1] = (this->data_[0][1] + this->data_[1][0]) / s; | 
| 206 | 
< | 
                        q[2] = 0.5 / s; | 
| 207 | 
< | 
                        q[3] = (this->data_[1][2] + this->data_[2][1]) / s; | 
| 203 | 
> | 
                        s = 0.5 / sqrt( 1.0 + this->data_[1][1] - this->data_[0][0] - this->data_[2][2] ); | 
| 204 | 
> | 
                        q[0] = (this->data_[2][0] - this->data_[0][2] ) * s; | 
| 205 | 
> | 
                        q[1] = (this->data_[0][1] + this->data_[1][0]) * s; | 
| 206 | 
> | 
                        q[2] = 0.25 / s; | 
| 207 | 
> | 
                        q[3] = (this->data_[1][2] + this->data_[2][1]) * s; | 
| 208 | 
  | 
                    } else { | 
| 209 | 
  | 
 | 
| 210 | 
< | 
                        s = sqrt( 1.0 + this->data_[2][2] - this->data_[0][0] - this->data_[1][1] ) * 2.0; | 
| 211 | 
< | 
                        q[0] = (this->data_[0][1] + this->data_[1][0]) / s; | 
| 212 | 
< | 
                        q[1] = (this->data_[0][2] + this->data_[2][0]) / s; | 
| 213 | 
< | 
                        q[2] = (this->data_[1][2] + this->data_[2][1]) / s; | 
| 214 | 
< | 
                        q[3] = 0.5 / s; | 
| 210 | 
> | 
                        s = 0.5 / sqrt( 1.0 + this->data_[2][2] - this->data_[0][0] - this->data_[1][1] ); | 
| 211 | 
> | 
                        q[0] = (this->data_[0][1] - this->data_[1][0]) * s; | 
| 212 | 
> | 
                        q[1] = (this->data_[0][2] + this->data_[2][0]) * s; | 
| 213 | 
> | 
                        q[2] = (this->data_[1][2] + this->data_[2][1]) * s; | 
| 214 | 
> | 
                        q[3] = 0.25 / s; | 
| 215 | 
  | 
                    } | 
| 216 | 
  | 
                }              | 
| 217 | 
  | 
 |