Axisang.inl.h 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #include "MathDfltHeader.h"
  2. namespace M {
  3. // constructor []
  4. inline Axisang::Axisang()
  5. : ang(0.0), axis()
  6. {}
  7. // constructor [Axisang]
  8. inline Axisang::Axisang(const Axisang& b)
  9. : ang(b.ang), axis(b.axis)
  10. {}
  11. // constructor [float, axis]
  12. inline Axisang::Axisang(float rad, const Vec3& axis_)
  13. : ang(rad), axis(axis_)
  14. {}
  15. // constructor [quat]
  16. inline Axisang::Axisang(const Quat& q)
  17. {
  18. ang = 2.0*acos(q.w);
  19. float length = M::sqrt(1.0 - q.w*q.w);
  20. if(isZero(length))
  21. axis = Vec3(0.0);
  22. else
  23. {
  24. length = 1.0/length;
  25. axis = Vec3(q.x*length, q.y*length, q.z*length);
  26. }
  27. }
  28. // constructor [mat3]
  29. inline Axisang::Axisang(const Mat3& m3)
  30. {
  31. if((fabs(m3(0, 1)-m3(1, 0))< EPSILON) && (fabs(m3(0, 2)-m3(2, 0))< EPSILON) && (fabs(m3(1, 2)-m3(2, 1))< EPSILON))
  32. {
  33. if((fabs(m3(0, 1)+m3(1, 0)) < 0.1) && (fabs(m3(0, 2)+m3(2, 0)) < 0.1) && (fabs(m3(1, 2)+m3(2, 1)) < 0.1) && (fabs(m3(0, 0)+m3(1, 1)+m3(2, 2))-3) < 0.1)
  34. {
  35. axis = Vec3(1.0, 0.0, 0.0);
  36. ang = 0.0;
  37. return;
  38. }
  39. ang = PI;
  40. axis.x = (m3(0, 0)+1)/2;
  41. if(axis.x > 0.0)
  42. axis.x = M::sqrt(axis.x);
  43. else
  44. axis.x = 0;
  45. axis.y = (m3(1, 1)+1)/2;
  46. if(axis.y > 0)
  47. axis.y = M::sqrt(axis.y);
  48. else
  49. axis.y = 0;
  50. axis.z = (m3(2, 2)+1)/2;
  51. if(axis.z > 0)
  52. axis.z = M::sqrt(axis.z);
  53. else
  54. axis.z = 0.0;
  55. bool xZero = (fabs(axis.x)<EPSILON);
  56. bool yZero = (fabs(axis.y)<EPSILON);
  57. bool zZero = (fabs(axis.z)<EPSILON);
  58. bool xyPositive = (m3(0, 1) > 0);
  59. bool xzPositive = (m3(0, 2) > 0);
  60. bool yzPositive = (m3(1, 2) > 0);
  61. if(xZero && !yZero && !zZero){
  62. if(!yzPositive) axis.y = -axis.y;
  63. }else if(yZero && !zZero){
  64. if(!xzPositive) axis.z = -axis.z;
  65. }else if (zZero){
  66. if(!xyPositive) axis.x = -axis.x;
  67. }
  68. return;
  69. }
  70. float s = M::sqrt((m3(2, 1) - m3(1, 2))*(m3(2, 1) - m3(1, 2))+(m3(0, 2) - m3(2, 0))*(m3(0, 2) - m3(2, 0))+(m3(1, 0) - m3(0, 1))*(m3(1, 0) - m3(0, 1)));
  71. if(fabs(s) < 0.001) s = 1;
  72. ang = acos((m3(0, 0) + m3(1, 1) + m3(2, 2) - 1)/2);
  73. axis.x= (m3(2, 1) - m3(1, 2))/s;
  74. axis.y= (m3(0, 2) - m3(2, 0))/s;
  75. axis.z= (m3(1, 0) - m3(0, 1))/s;
  76. }
  77. } // end namaspace