我正在处理操纵杆的音高。
此音高可以在0(全部向下)和1(全部向上)之间变化。 间距为0.5表示操纵杆处于中间位置。
我想找到一个公式,可以将该间距“映射”到给定的最小和最大值。
配方设计师会告诉我
- that a joystick pitch value of 0 would correspond to a given minimum (let's say -20)
- that a joystick pitch value of 1 would correspond to a given maximum (let's say 20)
- that a joystick pitch value of 0.5 would correspond to 0 (as it's in the middle of minimum and maximum
我很忙,我找不到解决这个难题的公式。
谢谢您的帮助。
答案 0 :(得分:1)
(max - min) * value + min
,其中value
在[0,1]
范围内,应将其映射到[min,max]
范围内。实际上,取决于编程语言†和值,可能存在一些问题,例如,如果min
和max
是有符号整数类型的最小值和最大值,则无法计算max - min
在相同类型中没有溢出。对所有人使用浮点类型可能是最安全的。
†当我回答时,该问题没有用任何语言标记,现在是用我不太熟练的C#标记。
答案 1 :(得分:1)
这非常简单,只需将max
和min
之间的距离比例并添加min
:
public double Range(double val, double min, double max)
=> min + val * (max - min);
用法示例:
Range(0.0, -20, 20)
Range(0.5, -20, 20)
Range(1.0, -20, 20)
输出
-20
0
20
答案 2 :(得分:0)
这通常称为“地图范围”方程式/函数。由于图形库的使用频率很高,许多图形库都将其作为该库的标准部分。
罗塞塔代码(Rosetta Code)具有每种主要语言的实现。
The implementation and example for C#是:
using System;
using System.Linq;
public class MapRange
{
public static void Main() {
foreach (int i in Enumerable.Range(0, 11))
Console.WriteLine($"{i} maps to {Map(0, 10, -1, 0, i)}");
}
static double Map(double a1, double a2, double b1, double b2, double s) => b1 + (s - a1) * (b2 - b1) / (a2 - a1);
}