Advertisement
henesua

Math extensions

Mar 15th, 2015
250
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // EXTENDED MATH FUNCTIONS
  2. // Converts from degrees to radians.
  3. Math.radians = function(degrees)
  4. {
  5.     return degrees * Math.PI / 180;
  6. };
  7.  
  8. // Converts from radians to degrees.
  9. Math.degrees = function(radians)
  10. {
  11.     return radians * 180 / Math.PI;
  12. };
  13.  
  14. // Converts from Axis Angle in radians to Euler in degrees
  15. Math.AxisAngleToEuler = function(x, y, z, angle)
  16. {
  17.     var heading,attitude,bank;
  18.     var s=Math.sin(angle);
  19.     var c=Math.cos(angle);
  20.     var t=1-c;
  21.     //  if axis is not already normalised then uncomment this
  22.     // double magnitude = Math.sqrt(x*x + y*y + z*z);
  23.     // if (magnitude==0) throw error;
  24.     // x /= magnitude;
  25.     // y /= magnitude;
  26.     // z /= magnitude;
  27.     if ((x*y*t + z*s) > 0.998)
  28.     { // north pole singularity detected
  29.         heading     = 2*atan2(x*Math.sin(angle/2),Math.cos(angle/2));
  30.         attitude    = Math.PI/2;
  31.         bank            = 0;
  32.     }
  33.     else if ((x*y*t + z*s) < -0.998)
  34.     { // south pole singularity detected
  35.         heading     = -2*atan2(x*Math.sin(angle/2),Math.cos(angle/2));
  36.         attitude    = -Math.PI/2;
  37.         bank            = 0;
  38.     }
  39.     else
  40.     {
  41.         heading     = Math.atan2(y * s- x * z * t , 1 - (y*y+ z*z ) * t);
  42.         attitude    = Math.asin(x * y * t + z * s) ;
  43.         bank            = Math.atan2(x * s - y * z * t , 1 - (x*x + z*z) * t);
  44.     }
  45.    
  46.     return {'x':Math.degrees(bank),'y':Math.degrees(heading),'z':Math.degrees(attitude)};
  47. };
  48.  
  49. // Converts from Euler in degrees to Axis Angle in radians
  50. Math.EulerToAxisAngle = function(bankDegrees, headingDegrees, attitudeDegrees)
  51. {
  52.     var Xradians    = Math.radians(bankDegrees); // bank
  53.     var Yradians    = Math.radians(headingDegrees); // heading
  54.     var Zradians    = Math.radians(attitudeDegrees); // attitude
  55.  
  56.     // Convert Euler to Axis-Angle
  57.     // NWN appears to use an axis angle
  58.     // downloaded from http://www.euclideanspace.com/maths/geometry/rotations/conversions/eulerToAngle/
  59.     var c1 = Math.cos(Yradians/2); // heading
  60.     var s1 = Math.sin(Yradians/2);
  61.     var c2 = Math.cos(Zradians/2);// altitude
  62.     var s2 = Math.sin(Zradians/2);
  63.     var c3 = Math.cos(Xradians/2); // bank
  64.     var s3 = Math.sin(Xradians/2);
  65.     var c1c2 = c1*c2;
  66.     var s1s2 = s1*s2;
  67.     var w =c1c2*c3 - s1s2*s3;
  68.     var x =c1c2*s3 + s1s2*c3;
  69.     var y =s1*c2*c3 + c1*s2*s3;
  70.     var z =c1*s2*c3 - s1*c2*s3;
  71.             w = 2 * Math.acos(w);
  72.     var norm = x*x+y*y+z*z;
  73.     if( norm==0 || norm <= 0.0001)
  74.     { // when all euler angles are zero angle = 0 so
  75.         // we can set axis to anything to avoid divide by zero
  76.         x="1.0";
  77.         y=z="0.0";
  78.     }
  79.     else
  80.     {
  81.         norm = Math.sqrt(norm);
  82.         x = (x/norm);
  83.         y = (y/norm);
  84.         z = (z/norm);
  85.     }
  86.    
  87.     return {'x':x,'y':y,'z':z,'w':w};
  88. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement