47ffdbe9496b14c1b1c3a26ce79f8df526beea9b.js 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. System.register(["cc"], function (_export, _context) {
  2. "use strict";
  3. var _cclegacy, ProjectileMathUtil, _crd, rad2Deg, deg2Rad;
  4. _export("default", void 0);
  5. return {
  6. setters: [function (_cc) {
  7. _cclegacy = _cc.cclegacy;
  8. }],
  9. execute: function () {
  10. _crd = true;
  11. _cclegacy._RF.push({}, "16ac3tSOM5FwpZe8CFKhU2G", "ProjectileMathUtil", undefined);
  12. /** 用于弧度转角度 */
  13. rad2Deg = 180 / Math.PI;
  14. /** 用于角度转弧度 */
  15. deg2Rad = Math.PI / 180;
  16. /**
  17. * 抛射运动的数学工具
  18. */
  19. _export("default", ProjectileMathUtil = class ProjectileMathUtil {
  20. /**
  21. * 计算耗时
  22. * @param x 水平位移
  23. * @param angle 初始角度
  24. * @param velocity 初始速度
  25. */
  26. static calculateTotalTime(x, angle, velocity) {
  27. // 初始角度(弧度制)
  28. var θ = angle * deg2Rad; // 时间
  29. // t = x / ( v * cos(θ) )
  30. var t = x / (velocity * Math.cos(θ));
  31. return t;
  32. }
  33. /**
  34. * 计算指定时刻的运动角度
  35. * @param angle 初始角度
  36. * @param velocity 初始速度
  37. * @param time 时间
  38. * @param gravity 重力加速度
  39. * @param returnInRadians 是否返回弧度制结果
  40. */
  41. static calculateAngleAtMoment(angle, velocity, time, gravity, returnInRadians) {
  42. if (returnInRadians === void 0) {
  43. returnInRadians = false;
  44. }
  45. // 重力加速度(垂直向下)
  46. var g = gravity; //
  47. // 初始角度(弧度制)
  48. var θ = angle * deg2Rad; // 水平瞬时速度
  49. // vx = v * cos(θ)
  50. var vx = velocity * Math.cos(θ); // 垂直瞬时速度
  51. // vy = v * sin(θ) - g * t
  52. var vy = velocity * Math.sin(θ) - g * time; // 该时刻的运动角度(弧度制)
  53. var θt = Math.atan(vy / vx);
  54. return returnInRadians ? θt : θt * rad2Deg;
  55. }
  56. /**
  57. * 计算指定时刻的位移距离
  58. * @param angle 初始角度
  59. * @param velocity 初始速度
  60. * @param gravity 重力加速度
  61. * @param time 时间点
  62. */
  63. static calculateDisplacementAtMoment(angle, velocity, gravity, time) {
  64. // 重力加速度(垂直向下)
  65. var g = gravity; // 初始角度(弧度制)
  66. var θ = angle * deg2Rad; // 水平位移
  67. // x = v * cos(θ) * t
  68. var x = velocity * Math.cos(θ) * time; // 垂直位移
  69. // y = v * sin(θ) * t - 0.5 * g * t^2
  70. var y = velocity * Math.sin(θ) * time - 0.5 * g * Math.pow(time, 2);
  71. return {
  72. x,
  73. y
  74. };
  75. }
  76. /**
  77. * 根据初始角度计算初始速度
  78. * @param x 水平距离
  79. * @param y 垂直距离
  80. * @param gravity 重力加速度
  81. * @param angle 初始角度(角度制)
  82. */
  83. static calculateWithAngle(x, y, gravity, angle) {
  84. // 重力加速度(垂直向下)
  85. var g = Math.abs(gravity); // 初始角度(弧度制)
  86. var θ = angle * deg2Rad; // 速度公式
  87. // v = sqrt( ( x^2 * g ) / ( 2 * x * sin(θ) * cos(θ) - 2 * y * cos(θ)^2 ) )
  88. // 部分计算结果
  89. var p1 = 2 * x * Math.sin(θ) * Math.cos(θ) - 2 * y * Math.pow(Math.cos(θ), 2); // 负数没有平方根
  90. if (p1 < 0) {
  91. return NaN;
  92. } // 速度
  93. var v = Math.sqrt(g * Math.pow(x, 2) / p1);
  94. return v;
  95. }
  96. /**
  97. * 根据初始速度计算初始角度
  98. * @param x 水平距离
  99. * @param y 垂直距离
  100. * @param gravity 重力加速度
  101. * @param velocity 初始速度
  102. */
  103. static calculateWithVelocity(x, y, velocity, gravity) {
  104. // 重力加速度(垂直向下)
  105. var g = gravity; // 初始速度
  106. var v = velocity; // 角度公式
  107. // θ = atan( ( -v^2 ± sqrt( v^4 - g * ( g * x^2 + 2 * y * v^2 ) ) / ( -g * x ) ) )
  108. // 部分计算结果
  109. var p1 = Math.pow(v, 2);
  110. var p2 = Math.pow(v, 4) - g * (g * Math.pow(x, 2) + 2 * y * p1); // 负数没有平方根
  111. if (p2 < 0) {
  112. return {
  113. angle1: NaN,
  114. angle2: NaN
  115. };
  116. } // 部分计算结果
  117. var p3 = Math.sqrt(p2); // 角度(两个解)
  118. var θ1 = Math.atan((-p1 + p3) / (-g * x));
  119. var θ2 = Math.atan((-p1 - p3) / (-g * x));
  120. return {
  121. angle1: θ1 * rad2Deg,
  122. angle2: θ2 * rad2Deg
  123. };
  124. }
  125. /**
  126. * 根据最大高度计算速度和角度
  127. * @param x 水平距离
  128. * @param y 垂直距离
  129. * @param gravity 重力加速度
  130. * @param maxHeight 最大高度
  131. */
  132. static calculateWithMaxHeight(x, y, maxHeight, gravity) {
  133. // 重力加速度(垂直向下)
  134. var g = gravity; // 最大高度
  135. var h = maxHeight; // 最大高度不能小于 0,也不能够小于垂直距离
  136. if (h < 0 || h - y < 0) {
  137. return {
  138. angle: NaN,
  139. velocity: NaN,
  140. time: NaN
  141. };
  142. } // 部分计算结果
  143. var p1 = Math.sqrt(2 * g * h);
  144. var p2 = Math.sqrt(2 * g * (h - y)); // 时间公式
  145. // t = ( -sqrt( 2 * g * h ) ± sqrt( 2 * g * ( h - y ) ) ) / -g
  146. var t1 = (-p1 + p2) / -g;
  147. var t2 = (-p1 - p2) / -g; // 始终使用较大的解
  148. var t = Math.max(t1, t2); // 角度公式
  149. // θ = atan( ( sqrt( 2 * g * h ) * t ) / x )
  150. var θ = Math.atan(p1 * t / x); // 速度公式
  151. // v = sqrt( 2 * g * h ) / sin(θ)
  152. var v = p1 / Math.sin(θ);
  153. return {
  154. angle: θ * rad2Deg,
  155. velocity: v,
  156. time: t
  157. };
  158. }
  159. });
  160. _cclegacy._RF.pop();
  161. _crd = false;
  162. }
  163. };
  164. });
  165. //# sourceMappingURL=47ffdbe9496b14c1b1c3a26ce79f8df526beea9b.js.map