Home Manual Reference Source

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;