Делал в одной программе шкалу времени от 20 секунд до 1 часа, оказалось лишним, кину сюда. Оптимизацией особо не занимался.
float ScaleToTime(float scale) переводит значение от 0 до 100 в значение от TIME_MIN до TIME_MAX, при этом их зависимость будет иметь такой же, какой имеет экспонента на интервале от X_MIN до X_MAX.
float TimeToScale(float time) - обратная функция.
В таком виде в середине шкалы (50) получается значение 673. После 99 устанавливается MAXFLOAT.
#define X_MIN 0.0f
#define X_MAX 3.0f
#define TIME_MAX 3600.0f
#define TIME_MIN 20.0f
float TimeToScale(float time)
{
float scale;
if(time < TIME_MAX)
{
float yMin = exp(X_MIN);
float yMax = exp(X_MAX);
float k = (TIME_MAX - TIME_MIN) / (yMax - yMin);
float y = (time - TIME_MIN) / k;
float x = logf(y + yMin);
scale = (x - X_MIN) * 100.0f / (X_MAX - X_MIN);
}
else
{
scale = 100.0f;
}
//NSLog(@"%f -> %f", time, scale);
return scale;
}
float ScaleToTime(float scale)
{
float time = 0.0f;
if(scale > 99.0f)
{
time = MAXFLOAT;
}
else
{
float x = X_MIN + (X_MAX - X_MIN) * scale / 100.0f;
float yMin = exp(X_MIN);
float yMax = exp(X_MAX);
float y = exp(x) - yMin;
float k = (TIME_MAX - TIME_MIN) / (yMax - yMin);
time = k * y + TIME_MIN;
}
//NSLog(@"%f -> %f", scale, time);
return time;
}