Home Manual Reference Source

src/math/S3Math.js

  1. /**
  2. * 数学的な便利関数を提供するユーティリティ
  3. * 各種演算(クランプ、ステップ関数、補間、等価判定、三角関数変換等)をまとめた静的オブジェクト
  4. *
  5. * @class
  6. * @module S3
  7. */
  8. const S3Math = {
  9. EPSILON: 2.2204460492503130808472633361816e-8,
  10.  
  11. /**
  12. * 値を[min, max]の範囲に収めます。
  13. * @param {number} x 対象の値
  14. * @param {number} min 最小値
  15. * @param {number} max 最大値
  16. * @returns {number} 範囲内に収めた値
  17. */
  18. clamp: function (x, min, max) {
  19. return x < min ? min : x > max ? max : x;
  20. },
  21.  
  22. /**
  23. * ステップ関数。xがedge未満なら1、それ以外は0を返します。
  24. * @param {number} edge 閾値
  25. * @param {number} x 対象の値
  26. * @returns {number} ステップ関数の値(0 or 1)
  27. */
  28. step: function (edge, x) {
  29. return edge > x ? 1 : 0;
  30. },
  31.  
  32. /**
  33. * 線形補間(mix)を行います。
  34. * @param {number} v0 始点
  35. * @param {number} v1 終点
  36. * @param {number} x 補間係数(0~1)
  37. * @returns {number} 補間結果
  38. */
  39. mix: function (v0, v1, x) {
  40. return v0 + (v1 - v0) * x;
  41. },
  42.  
  43. /**
  44. * スムーズステップ補間(滑らかな0-1補間)を行います。
  45. * @param {number} v0 始点
  46. * @param {number} v1 終点
  47. * @param {number} x 補間係数(0~1)
  48. * @returns {number} 補間結果
  49. */
  50. smoothstep: function (v0, v1, x) {
  51. const s = x * x * (3.0 - 2.0 * x);
  52. return v0 + (v1 - v0) * s;
  53. },
  54.  
  55. /**
  56. * 2つの値が十分近いかどうか判定します(EPSILON以下の差)。
  57. * @param {number} x1 値1
  58. * @param {number} x2 値2
  59. * @returns {boolean} 近ければtrue
  60. */
  61. equals: function (x1, x2) {
  62. return Math.abs(x1 - x2) < S3Math.EPSILON;
  63. },
  64.  
  65. /**
  66. * 剰余を返します(負数にも対応)。
  67. * @param {number} x
  68. * @param {number} y
  69. * @returns {number} 剰余
  70. */
  71. mod: function (x, y) {
  72. return x - y * Math.floor(x / y);
  73. },
  74.  
  75. /**
  76. * 符号を返します。
  77. * @param {number} x
  78. * @returns {number} 正なら1.0、負なら-1.0
  79. */
  80. sign: function (x) {
  81. return x >= 0.0 ? 1.0 : -1.0;
  82. },
  83.  
  84. /**
  85. * 小数部を返します。
  86. * @param {number} x
  87. * @returns {number} 小数部
  88. */
  89. fract: function (x) {
  90. return x - Math.floor(x);
  91. },
  92.  
  93. /**
  94. * 逆平方根(1/√x)を計算します。
  95. * @param {number} x
  96. * @returns {number} 逆平方根
  97. */
  98. rsqrt: function (x) {
  99. return Math.sqrt(1.0 / x);
  100. },
  101.  
  102. /**
  103. * 角度(度)をラジアンに変換します。
  104. * @param {number} degree 度数
  105. * @returns {number} ラジアン値
  106. */
  107. radius: function (degree) {
  108. return (degree / 360.0) * (2.0 * Math.PI);
  109. },
  110.  
  111. /**
  112. * ラジアンを角度(度)に変換します。
  113. * @param {number} rad ラジアン値
  114. * @returns {number} 度数
  115. */
  116. degrees: function (rad) {
  117. return (rad / (2.0 * Math.PI)) * 360.0;
  118. }
  119. };
  120.  
  121. export default S3Math;