Кривые, которые вы проиллюстрировали, очень похожи на кривые gamma correction.Идея заключается в том, что минимальный и максимальный диапазон остается таким же, как и вход, но середина согнута, как у вас на графиках (что я мог бы отметить, это не круговая дуга, которую вы получите от реализации косинуса).
Графически это выглядит следующим образом:
alt text http://upload.wikimedia.org/wikipedia/commons/thumb/7/74/GammaFunctionGraph.svg/200px-GammaFunctionGraph.svg.png
Таким образом, с вдохновением, вот математика ...
Если значения х в диапазоне от 0 до 1, то функция достаточно прост:
y = f(x, gamma) = x^gamma
Добавить Xmax значение для масштабирования (то есть х = 0 до 100), а функция принимает вид:
y = f(x, gamma) = ((x/xmax)^gamma) * xmax
или в качестве альтернативы:
y = f(x, gamma) = (x^gamma)/(xmax^(gamma - 1))
Вы можете принять это шаг вперед, если вы хотите добавить ненулевую XMIN.
Когда гамма равна 1, линия всегда идеально линейна (y = x). Если x меньше 1, ваша кривая наклоняется вверх. Если x больше 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 представляет ваше максимальное значение x.
Почему C# тег? В конечном итоге ваше решение может быть C#, но я ничего не вижу в проблеме, которая является C#. Удаление тега ... – abelenky
Объясните поведение, которое вы хотите. (кроме начала/конечных точек) Является ли он экспоненциальным? Полином? логарифмическая? Похоже, что уклон около 0 линейный, а затем масштабируется вверх по мере необходимости для достижения конечной точки. –
... или интерполяция между линейным и чем-то. –