Кривые, которые вы иллюстрировали, очень похожи на гамма-коррекция кривые. Идея заключается в том, что минимум и максимум диапазона остаются такими же, как у входа, но середина согнута, как у вас на графиках (я могу отметить, что не дуга окружности, которую вы получите из косинуса реализации).
Графически это выглядит так:
(источник: wikimedia.org )
Итак, с этим как вдохновение, вот математика ...
Если ваши значения x варьировались от 0 до 1, функция довольно проста:
y = f(x, gamma) = x ^ gamma
Добавьте значение xmax для масштабирования (то есть x = от 0 до 100), и функция становится:
y = f(x, gamma) = ((x / xmax) ^ gamma) * xmax
или альтернативно:
y = f(x, gamma) = (x ^ gamma) / (xmax ^ (gamma - 1))
Вы можете сделать еще один шаг, если хотите добавить ненулевой xmin.
Когда гамма равна 1, линия всегда идеально линейна (у = х). Если х меньше 1, ваша кривая изгибается вверх. Если х больше 1, ваша кривая наклоняется вниз. Обратное значение гаммы преобразует значение обратно в исходное (x = f (y, 1 / g) = f (f (x, g), 1 / g).
Просто настройте значение гаммы в соответствии со своим вкусом и потребностями применения. Поскольку вы хотите предоставить пользователю несколько вариантов «повышения чувствительности», вы можете предложить своим пользователям выбор в линейном масштабе, скажем, от -4 (наименее чувствительный) до 0 (без изменений) до 4 (наиболее чувствительный). ), и масштабируйте свои внутренние значения гаммы с помощью степенной функции. Другими словами, предоставьте пользователю выбор (-4, -3, -2, -1, 0, 1, 2, 3, 4), но переведите его в значения гаммы (5.06, 3.38, 2.25, 1.50, 1.00 0,67, 0,44, 0,30, 0,20).
Кодирование в C # может выглядеть примерно так:
public class SensitivityAdjuster {
public SensitivityAdjuster() { }
public SensitivityAdjuster(int level) {
SetSensitivityLevel(level);
}
private double _Gamma = 1.0;
public void SetSensitivityLevel(int level) {
_Gamma = Math.Pow(1.5, level);
}
public double Adjust(double x) {
return (Math.Pow((x / 100), _Gamma) * 100);
}
}
Чтобы использовать его, создайте новый SensitivityAdjuster, установите уровень чувствительности в соответствии с предпочтениями пользователя (либо с помощью конструктора или метода, и от -4 до 4, вероятно, будут разумными значениями уровня), и вызовите Adjust (x), чтобы получить скорректированное выходное значение. Если вам нужен более широкий или более узкий диапазон разумных уровней, вы должны уменьшить или увеличить это значение 1,5 в методе SetSensitivityLevels. И, конечно, 100 представляет ваше максимальное значение х.