piupiudev


Пиу-пиу. Код и другие штучки.


Previous Entry Share Next Entry
Прогрессивная шкала
чебурашка
ferrum_mamuth wrote in piupiudev
Делал в одной программе шкалу времени от 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;
}

?

Log in