我得到的值在 -360 到 360 的范圍內,應該映射到對應于 45 的分數的序列。(或任何其他值,我對映射演算法比這里的用例更感興趣)。
| 在 | -360 | -315 | -270 | -225 | -180 | -135 | -90 | -45 | 0 | 45 | 90 | 135 | 180 | 225 | 270 | 325 | 360 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 步 | 0 | 1 | 0 | -1 | 0 | 1 | 0 | -1 | 0 | 1 | 0 | -1 | 0 | 1 | 0 | -1 | 0 |
| 出去 | 0 | 45 | 0 | -45 | 0 | 45 | 0 | -45 | 0 | 45 | 0 | -45 | 0 | 45 | 0 | -45 | 0 |
我可以/應該使用線性變換嗎?或者我如何設定如下映射:
var mapRange = function(base_range, target_range, s) {
return target_range[0] (s - base_range[0]) * (target_range[1] - target_range[0]) / (base_range[1] - base_range[0]);
};
為了這?
編輯:添加了所需的輸出。認為將其分解為 -1 到 1 的范圍意味著微不足道的 *45
uj5u.com熱心網友回復:
您正在尋找的是三角波,可以使用以下公式計算:
4 * a / p * abs(((i - p / 4) % p) - p / 2) - a
請注意,%公式中是模數,而不是余數,因此在 JavaScript 中我們需要定義一個函式來回傳預期結果(請參閱檔案,以及此處的一些示例函式)。
在您的情況下,a(幅度)為 1,p(周期)為 180。您可以撰寫一個函式來計算該值,然后使用它來計算各個值:
const mod = (n, m) => ((n % m) m) % m
const triWave = (i, a, p) => 4 * a / p * Math.abs(mod(i - p / 4, p) - p / 2) - a
console.log(triWave(22.5, 1, 180))
console.log(triWave(-56.25, 1, 180))
const inp = Array.from({ length: 17 }, (_, i) => -360 45 * i)
const steps = inp.map(i => triWave(i, 1, 180))
console.log(steps)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/512737.html
上一篇:如何正確旋轉像素網格中的物件?
