| 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 |
|
|