src/math/S3Math.js
- /**
- * 数学的な便利関数を提供するユーティリティ
- * 各種演算(クランプ、ステップ関数、補間、等価判定、三角関数変換等)をまとめた静的オブジェクト
- *
- * @class
- * @module S3
- */
- const S3Math = {
- EPSILON: 2.2204460492503130808472633361816e-8,
-
- /**
- * 値を[min, max]の範囲に収めます。
- * @param {number} x 対象の値
- * @param {number} min 最小値
- * @param {number} max 最大値
- * @returns {number} 範囲内に収めた値
- */
- clamp: function (x, min, max) {
- return x < min ? min : x > max ? max : x;
- },
-
- /**
- * ステップ関数。xがedge未満なら1、それ以外は0を返します。
- * @param {number} edge 閾値
- * @param {number} x 対象の値
- * @returns {number} ステップ関数の値(0 or 1)
- */
- step: function (edge, x) {
- return edge > x ? 1 : 0;
- },
-
- /**
- * 線形補間(mix)を行います。
- * @param {number} v0 始点
- * @param {number} v1 終点
- * @param {number} x 補間係数(0~1)
- * @returns {number} 補間結果
- */
- mix: function (v0, v1, x) {
- return v0 + (v1 - v0) * x;
- },
-
- /**
- * スムーズステップ補間(滑らかな0-1補間)を行います。
- * @param {number} v0 始点
- * @param {number} v1 終点
- * @param {number} x 補間係数(0~1)
- * @returns {number} 補間結果
- */
- smoothstep: function (v0, v1, x) {
- const s = x * x * (3.0 - 2.0 * x);
- return v0 + (v1 - v0) * s;
- },
-
- /**
- * 2つの値が十分近いかどうか判定します(EPSILON以下の差)。
- * @param {number} x1 値1
- * @param {number} x2 値2
- * @returns {boolean} 近ければtrue
- */
- equals: function (x1, x2) {
- return Math.abs(x1 - x2) < S3Math.EPSILON;
- },
-
- /**
- * 剰余を返します(負数にも対応)。
- * @param {number} x
- * @param {number} y
- * @returns {number} 剰余
- */
- mod: function (x, y) {
- return x - y * Math.floor(x / y);
- },
-
- /**
- * 符号を返します。
- * @param {number} x
- * @returns {number} 正なら1.0、負なら-1.0
- */
- sign: function (x) {
- return x >= 0.0 ? 1.0 : -1.0;
- },
-
- /**
- * 小数部を返します。
- * @param {number} x
- * @returns {number} 小数部
- */
- fract: function (x) {
- return x - Math.floor(x);
- },
-
- /**
- * 逆平方根(1/√x)を計算します。
- * @param {number} x
- * @returns {number} 逆平方根
- */
- rsqrt: function (x) {
- return Math.sqrt(1.0 / x);
- },
-
- /**
- * 角度(度)をラジアンに変換します。
- * @param {number} degree 度数
- * @returns {number} ラジアン値
- */
- radius: function (degree) {
- return (degree / 360.0) * (2.0 * Math.PI);
- },
-
- /**
- * ラジアンを角度(度)に変換します。
- * @param {number} rad ラジアン値
- * @returns {number} 度数
- */
- degrees: function (rad) {
- return (rad / (2.0 * Math.PI)) * 360.0;
- }
- };
-
- export default S3Math;