The curves you illustrated are very similar to the gamma correction curves . The idea is that the minimum and maximum of the range remain the same as the input, but the middle is bent, as you have on the graphs (which I could notice, this is not a circular arc that you will get from the implementation of the cosine).
Graphically, it looks like this:
alt text http://upload.wikimedia.org/wikipedia/commons/thumb/7/74/GammaFunctionGraph.svg/200px-GammaFunctionGraph.svg.png
So, with this, like inspiration, here is the math ...
If your x values ranged from 0 to 1, the function is pretty simple:
y = f(x, gamma) = x ^ gamma
Add the xmax value for scaling (i.e., from x = 0 to 100) and the function will become:
y = f(x, gamma) = ((x / xmax) ^ gamma) * xmax
or alternatively:
y = f(x, gamma) = (x ^ gamma) / (xmax ^ (gamma - 1))
You can do this even further if you want to add a nonzero xmin.
When gamma is 1, the line is always perfectly linear (y = x). If x is less than 1, your curve tilts up. If x is greater than 1, your curve deviates downward. The returned gamma value converts the value back to the original (x = f (y, 1 / g) = f (f (x, g), 1 / g).
Just adjust the gamma value according to your own taste and needs of the application. Since you want to provide the user with several “sensitivity enhancement” options, you may want to give users a choice on a linear scale, say, from -4 (least sensitive) to 0 (no change) to 4 (most sensitive) and scale your internal gamma values with using the power function. In other words, give the user a choice (-4, -3, -2, -1, 0, 1, 2, 3, 4), but translate this value into the gamut (5.06, 3.38, 2.25, 1.50, 1.00, 0.67 0.44, 0.30, 0.20).
Coding in C # might look something like this:
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); } }
To use it, create a new SensitivityAdjuster, set the sensitivity level according to your preferences (either using the constructor, or using the method, and from -4 to 4 are likely to be reasonable level values) and call Adjust (x) to get adjusted output value. If you needed a wider or narrower range of reasonable levels, you would decrease or increase this value of 1.5 in the SetSensitivityLevels method. And of course, 100 represents your maximum x value.