としましょうx
、a
とb
は数字です。x
セグメントの境界に制限する必要があります[a, b]
。
言い換えれば、私はクランプ関数が必要です:
clamp(x) = max( a, min(x, b) )
誰かがこれのより読みやすいバージョンを思い付くことができますか?
としましょうx
、a
とb
は数字です。x
セグメントの境界に制限する必要があります[a, b]
。
言い換えれば、私はクランプ関数が必要です:
clamp(x) = max( a, min(x, b) )
誰かがこれのより読みやすいバージョンを思い付くことができますか?
あなたがそれをする方法はかなり標準的です。ユーティリティclamp
関数を定義できます。
/**
* Returns a number whose value is limited to the given range.
*
* Example: limit the output of this computation to between 0 and 255
* (x * 255).clamp(0, 255)
*
* @param {Number} min The lower boundary of the output range
* @param {Number} max The upper boundary of the output range
* @returns A number in the range [min, max]
* @type Number
*/
Number.prototype.clamp = function(min, max) {
return Math.min(Math.max(this, min), max);
};
(言語の組み込みを拡張することは一般的に眉をひそめますが)
あまり「数学」指向のアプローチではありませんが、このように機能するはずです。このように、<
/>
テストは公開されます(ミニマックスよりも理解しやすいかもしれません)が、実際には「読み取り可能」の意味によって異なります。
function clamp(num, min, max) {
return num <= min
? min
: num >= max
? max
: num
}
es6 アロー関数を使用できる場合は、部分適用アプローチを使用することもできます。
const clamp = (min, max) => (value) =>
value < min ? min : value > max ? max : value;
clamp(2, 9)(8); // 8
clamp(2, 9)(1); // 2
clamp(2, 9)(10); // 9
or
const clamp2to9 = clamp(2, 9);
clamp2to9(8); // 8
clamp2to9(1); // 2
clamp2to9(10); // 9
関数を定義したくない場合は、次のように書くことMath.min(Math.max(x, a), b)
はそれほど悪くありません。
お気に入り:
[min,x,max].sort()[1]