Сдвиг средней точки диапазона номеров - PullRequest
0 голосов
/ 04 июля 2018

У меня есть функция, которая нормализует любой диапазон номеров до нового диапазона.

Например
[123,456] до [0,10]
или
[-50,50] до [-1,1]

Мне нужна помощь в смещении средней точки нового диапазона.

Я использую это для ползунка с графическим интерфейсом, который имеет диапазон [-100,100], но контролирует значение [-2,2].
Значение по умолчанию для GUI Slider - 0, но значение по умолчанию - 1 (нет).
Моя программа представляет собой графический интерфейс для интерфейса командной строки, и я не могу изменить значение этой программы по умолчанию на 0.

slider

Slider
-100 --------------||-------------- 100
                    0
Value
-2 |  |  | -1 |  |  0|  |  | 1  |  |  2

Shifted Value
-2 |  | -1 |  | 0 | 1|  |  |  |  |  | 2

Нормализация

https://dotnetfiddle.net/42jHvM

// Normalize Function
public static double Normalize(double val, double valmin, double valmax, double min, double max, double midpoint) 
{
    return (((val - valmin) / (valmax - valmin)) * (max - min)) + min;
}

double output = Normalize(  0, // slider input
                         -100, // input min
                          100, // input max
                           -2, // normalize min
                            2, // normalize max
                            1  // middle point
                         );

Сдвиг средней точки

В моем примере я использую [-100,100], преобразованный в [-2,2].

Средняя точка input [-100,100] равна 0.
Но мне нужно, чтобы output [-2,2] имел среднюю точку 1 вместо 0.

Таким образом, оно будет наклонено, медленнее к -2, быстрее к 2.

Пример Я сделал в фотошопе визуализацию смещения средней точки с помощью градиента.

shift

Облегчение

Я пытался использовать Ease Out Tween , чтобы сместить среднюю точку, но я не знаю, какие значения использовать.
Пример вывода должен быть Min: -2, Mid: 1, Max: 2.

https://dotnetfiddle.net/nfNlBC

Используется:

//t: current time
//b: start value
//c: change in value
//d: duration

После смещения средней точки:

Ввод -100 должен вывести -2.
Ввод -50 должен выводить -0.50?
Ввод 0 должен выдать 1.
Ввод 50 должен выводить 1.75?
Ввод 100 должен выдавать 2.

До

-100 | -50 | -25  |  0  |  25 |  50 | 100

 -2  | -1  | -0.5 |  0  | 0.5 |  1  |  2

После approximated

-100 | -50  | -25  |  0  |  25  |  50  | 100

 -2  |-0.50 | 0.25 |  1  | 1.25 | 1.75 |  2

Вопрос

Как я могу изменить функцию Normalize или запустить ее вывод через новую функцию Shift / Easing, чтобы установить новую среднюю точку диапазона и перенастроить числа?

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Я не понимаю, зачем вам такое отображение, но способ сделать это:

public static double Normalize( double val, double valmin, double valmax, double min, double max, double midpoint )
{
  double mid = ( valmin + valmax ) / 2.0;
  if ( val < mid )
  {
    return ( val - valmin ) / ( mid - valmin ) * ( midpoint - min ) + min;
  }
  else
  {
    return ( val - mid ) / ( valmax - mid ) * ( max - midpoint ) + midpoint;
  }
}
0 голосов
/ 04 июля 2018

Есть несколько способов сделать это, но если линейной интерполяции достаточно, то вы можете просто использовать простое растяжение и сжатие входного параметра с помощью кусочной функции.

public static double Interpolate(double val, double valmin, double valmax, double min, double max)
{
    return (max - min) * (val - 0.5 * (valmax + valmin)) / (valmax - valmin) + 0.5 * (max + min);
}

public static double Normalize(double val, double valmin, double valmax, double min, double max, double midpoint)
{
    double m = Interpolate(midpoint, valmin, valmax, min, max);
    if (val < m) {
        return Interpolate(val, valmin, m, min, midpoint);
    } else if (val > m) {
        return Interpolate(val, m, valmax, midpoint, max);
    } else {
        return m;
    }
}

У вас должна быть возможность заменить Interpolate на что-то более причудливое, например, одну из связанных вами форм замедления, со следующими сопоставлениями имен ваших параметров и их имен:

t = val - 0.5 * (valmax + valmin)
b = 0.5 * (max + min)
c = max - min
d = valmax - valmin
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...