MathUtil.ts 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. import { Vec2 } from "cc";
  2. export class MathUtil {
  3. public randomSeed: number = null
  4. /**
  5. * 获取范围内的随机数(min <= {return}} <= max)
  6. * @param min 最小值
  7. * @param max 最大值
  8. */
  9. static getRandom(min: number, max: number) {
  10. if (min == max) {
  11. return min;
  12. }
  13. return (min >= max) ? 0 : Math.floor(Math.random() * (max - min + 1)) + min;
  14. }
  15. /**
  16. * 获取随机数
  17. * @param min
  18. * @param max
  19. * @param seed 随机种子
  20. * @param isFloor 是否取整数
  21. * @returns
  22. */
  23. static getRandomBySeed(min: number, max: number, seed: number, isFloor?: boolean) {
  24. max = max || 1
  25. min = min || 0
  26. seed = (seed * 9301 + 49297) % 233280
  27. let rnd = seed / 233280
  28. if (isFloor) {
  29. return Math.floor(min + rnd * (max - min))
  30. } else {
  31. return min + rnd * (max - min)
  32. }
  33. }
  34. /**
  35. * 百分比出现几率
  36. * @param percentage
  37. * @returns
  38. */
  39. static getRandomPercentage(percentage: number) {
  40. let random = this.getRandom(0, 100)
  41. if (random < percentage) {
  42. return true
  43. }
  44. return false
  45. }
  46. /**
  47. * 定和随机分配(getRandomBySumList(5,100):随机5个整数,5个数的和为100)
  48. * @param count 数量
  49. * @param sum 定和
  50. */
  51. static getRandomBySumList(count: number, sum: number): number[] {
  52. var residue = sum;
  53. var value = 0;
  54. var result: Array<number> = [];
  55. for (let i = 0; i < count; i++) {
  56. value = this.getRandom(1, residue - 1);
  57. if (i == count - 1) {
  58. value = residue;
  59. } else {
  60. residue -= value;
  61. }
  62. result.push(value);
  63. }
  64. return result;
  65. }
  66. /**
  67. * 两点之间的角度
  68. * @param pos1 坐标1
  69. * @param pos2 坐标2
  70. */
  71. static getAngle(pos1: Vec2, pos2: Vec2) {
  72. return Math.atan2(pos1.y - pos2.y, pos1.x - pos2.x) * (180 / Math.PI);
  73. }
  74. /**
  75. * 将角度转为弧度
  76. * @param angle 角度
  77. */
  78. static angleToRadian(angle: number) {
  79. return angle * Math.PI / 180;
  80. }
  81. /**
  82. * 将弧度转为角度
  83. * @param radian 弧度
  84. */
  85. static radianToAngle(radian: number) {
  86. return radian / Math.PI * 180;
  87. }
  88. /**
  89. * 获取两向量的夹角
  90. * @param vector1 向量1
  91. * @param vector2 向量2
  92. */
  93. static getVectorAngle(vector1: Vec2, vector2: Vec2) {
  94. return (Math.atan2(vector2.y, vector2.x) - Math.atan2(vector1.y, vector1.x)) * (180 / Math.PI);
  95. }
  96. /**
  97. * 将角度转为向量
  98. * @param angle 角度
  99. */
  100. static angleToVector(angle: number) {
  101. let radian = this.angleToRadian(angle);
  102. return new Vec2(Math.cos(radian), Math.sin(radian)).normalize();
  103. }
  104. /**
  105. * 将向量转为角度
  106. * @param vector 向量
  107. */
  108. static vectorToAngle(vector: Vec2) {
  109. let dir = vector.normalize();
  110. let radian = dir.signAngle(new Vec2(1, 0));
  111. return -this.radianToAngle(radian);
  112. }
  113. static isInteger(num: number) {
  114. return (num <= 0) ? false : Math.round(num) === num;
  115. }
  116. //乘法函数,用来得到精确的乘法结果
  117. //说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
  118. //调用:accMul(arg1,arg2)
  119. //返回值:arg1乘以arg2的精确结果
  120. static accMul(arg1, arg2) {
  121. var m = 0, s1 = arg1.toString(), s2 = arg2.toString();
  122. try { m += s1.split(".")[1].length } catch (e) { }
  123. try { m += s2.split(".")[1].length } catch (e) { }
  124. return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
  125. }
  126. //加法函数,用来得到精确的加法结果
  127. //说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
  128. //调用:accAdd(arg1,arg2)
  129. //返回值:arg1加上arg2的精确结果
  130. static accAdd(arg1, arg2) {
  131. var r1, r2, m;
  132. try { r1 = arg1.toString().split(".")[1].length } catch (e) { r1 = 0 }
  133. try { r2 = arg2.toString().split(".")[1].length } catch (e) { r2 = 0 }
  134. m = Math.pow(10, Math.max(r1, r2));
  135. return (arg1 * m + arg2 * m) / m;
  136. }
  137. //减法函数
  138. static accSub(arg1, arg2) {
  139. var r1, r2, m, n;
  140. try { r1 = arg1.toString().split(".")[1].length } catch (e) { r1 = 0 }
  141. try { r2 = arg2.toString().split(".")[1].length } catch (e) { r2 = 0 }
  142. m = Math.pow(10, Math.max(r1, r2));
  143. //last modify by deeka
  144. //动态控制精度长度
  145. n = (r1 >= r2) ? r1 : r2;
  146. return ((arg2 * m - arg1 * m) / m).toFixed(n);
  147. }
  148. }