You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

64 lines
2.1 KiB

  1. Math = math
  2. Math.E = 2.718281828459045 -- 自然数
  3. Math.LN2 = 0.6931471805599453 -- 2的自然对数
  4. Math.LN10 = 2.302585092994046 -- 10的自然对数
  5. Math.LOG2E = 1.4426950408889634 -- log 2 为底的自然数
  6. Math.LOG10E = 0.4342944819032518 -- log 10 为底的自然数
  7. Math.PI = 3.141592653589793 -- π
  8. Math.HALF_PI = 1.57079632679489661923 -- 1/2 π
  9. Math.SQRT1_2 = 0.7071067811865476 -- 1/2的平方根
  10. Math.SQRT2 = 1.4142135623730951 -- 2的平方根
  11. -- p, q is on the same of line 1
  12. function Math.isSame(line1, p, q)
  13. local dx = line1.endPoint.x - line1.startPoint.x;
  14. local dy = line1.endPoint.y - line1.startPoint.y;
  15. local dx1 = p.x - line1.startPoint.x;
  16. local dy1 = p.y - line1.startPoint.y;
  17. local dx2 = q.x - line1.endPoint.x;
  18. local dy2 = q.y - line1.endPoint.y;
  19. return (dx*dy1-dy*dx1)*(dx*dy2-dy*dx2) > 0;
  20. end
  21. -- 2 line segments (s1, s2) are intersect?
  22. function Math.isIntersect(line1, line2)
  23. local b1 = Math.isSame(line1, line2.startPoint, line2.endPoint);
  24. local b2 = Math.isSame(line2, line1.startPoint, line1.endPoint);
  25. return not b1 and not b2;
  26. end
  27. function Math.round(num)
  28. return math.floor(num + 0.5)
  29. end
  30. function Math.angle2Radian(angle)
  31. return angle*math.pi/180
  32. end
  33. function Math.radian2Angle(radian)
  34. return radian/math.pi*180
  35. end
  36. -- 从球面坐标系(半径,经度,纬度)转换到笛卡尔坐标系(XYZ)
  37. -- 半径,离原点的距离,一般是一个正数
  38. -- 经度,0~2PI,0代表正前方,PI代表正后方
  39. -- 纬度,HALF_PI代表水平位置,+PI代表底,0代表顶
  40. function Math.SphericalToCartesian(sphericalPos)
  41. return {
  42. x = sphericalPos.x * math.cos(sphericalPos.y) * math.sin(sphericalPos.z);
  43. z = sphericalPos.x * math.sin(sphericalPos.y) * math.sin(sphericalPos.z);
  44. y = sphericalPos.x * math.cos(sphericalPos.z);
  45. }
  46. end
  47. -- 从笛卡尔坐标系(XYZ)转换到球面坐标系(半径,经度,纬度)
  48. function Math.CartesianToSpherical(cartesianPos)
  49. local r = math.sqrt(cartesianPos.x * cartesianPos.x + cartesianPos.y * cartesianPos.y + cartesianPos.z * cartesianPos.z)
  50. local lon = math.atan2(cartesianPos.z, cartesianPos.x)
  51. local lat = math.acos(cartesianPos.y / r)
  52. return cc.vec3(r, lon, lat)
  53. end