将介于0和1之间的a标准化为给定的最小值和最大值

时间:2018-12-21 23:04:09

标签: c# math

我正在处理操纵杆的音高。

此音高可以在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

我很忙,我找不到解决这个难题的公式。

谢谢您的帮助。

3 个答案:

答案 0 :(得分:1)

(max - min) * value + min,其中value[0,1]范围内,应将其映射到[min,max]范围内。实际上,取决于编程语言†和值,可能存在一些问题,例如,如果minmax是有符号整数类型的最小值和最大值,则无法计算max - min在相同类型中没有溢出。对所有人使用浮点类型可能是最安全的。

†当我回答时,该问题没有用任何语言标记,现在是用我不太熟练的C#标记。

答案 1 :(得分:1)

这非常简单,只需将maxmin之间的距离比例并添加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);
}