Нормализация от 0 до 1 до заданного минимума и максимума - PullRequest
0 голосов
/ 22 декабря 2018

Я имею дело с высотой джойстика.

Эта высота может варьироваться от 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 голосов
/ 22 декабря 2018

Это обычно называется уравнением / функцией "диапазон карты".Многие графические библиотеки поставляются с этим как стандартная часть библиотеки из-за того, как часто он используется.

В Rosetta Code есть реализации на всех основных языках.

Реализация и пример для 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);
}
0 голосов
/ 22 декабря 2018

Это довольно просто, просто возьмите пропорцию расстояния между 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
0 голосов
/ 22 декабря 2018

(max - min) * value + min, где value находится в диапазоне [0,1], следует сопоставить его с диапазоном [min,max].На практике могут возникнуть некоторые проблемы в зависимости от языка программирования † и значений, например, если min и max являются минимальным и максимальным целочисленным типом со знаком, вы не можете вычислить max - min без переполнения в этом же типе,Использование типов с плавающей запятой для всех, вероятно, наиболее безопасно.

† Когда я ответил, вопрос не был помечен каким-либо языком, теперь он помечен C #, на котором я не особенно бегло говорю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...