Как мне изменить эту функцию питания слайдера? - PullRequest
0 голосов
/ 11 января 2020

Мне удалось перевести это из кода потенциометра LTSpice Хельмута Зенневальда. Но математика - не моя вещь, поэтому я не уверен, что можно изменить это так, чтобы, если заданная точка в алгоритме сегмента ln возвращала соответствующее значение в исходном прямом сегменте. На данный момент мое сверхъестественное решение состоит в том, чтобы сканировать эту вещь, чтобы получить ответ. Вот оригинальный рабочий код пересылки.

//power function slider 
public float projectOntoSegment(float val, float min, float max) {

    //val is location as percentage on segment
    float range = max - min;
    float tap_point = 0.2f;//knee point as percentage
    float tap_val = range * 0.05f; //how much at knee:lets say 5% of scale
    double exp = Math.log(tap_val / range) / Math.log(tap_point);
    double ratio = Math.pow(val, exp);
    float eff_val = min + (float) (range * ratio);

    //eff_val = min + (range*val);//linear

    return eff_val;
}

1 Ответ

0 голосов
/ 11 января 2020

Я нашел решение с помощью некоторого стекопотока и удачи. Зачем это вообще нужно? Потому что это необходимо на этапе инициализации ползунка logaritmi c. Вот и методы, и пример использования. Пользователь дает начальное значение в логарифмическом масштабе c. Это все еще просто желаемое значение, а не реальное. Чтобы получить действительное значение, требуемое значение должно сначала быть обратно сопоставлено, чтобы быть эквивалентным линейным значением на ползунке, а затем передано в прямое логарифмическое отображение c. Это приводит к хорошему и плавному многогранному опыту слайдера

//ln power log
public float projectOntoLogCurve(float input, float min, float max, float kneePoint, float kneeMount) {

    //input is location as percentage on segment
    float range = max - min;
    double exp = Math.log(kneeMount) / Math.log(kneePoint);
    double ratio = Math.pow(input, exp);
    float output = min + (float) (range * ratio);

    return output;
}

//**********************************************
//reverse ln power log
public float projectBackFromLogCurve(float ln_input, float min, float max, float kneePoint, float kneeMount) {

    //ln_input is logaritmic location  on log curve
    float range = max - min;
    float z = (ln_input - min) / range;
    double exp = Math.log(kneeMount) / Math.log(kneePoint);
    float output = (float) Math.pow(z, 1.0 / exp);
    return output;// projection from log curve to linear curve
}

Используйте как:

    float min = -20.0f;
    float max = 100.0f;
    float def_val = 42.0f;
    float knee_point = 0.2f; //choose point as percentage on slider
    float knee_mount = 0.05f; //choose level value at that point
    float initVal = projectBackFromLogCurve(def_val, min, max, knee_point, knee_mount);
    this.value = initVal;
    float start = projectOntoLogCurve(this.value, min, max, knee_point, knee_mount);
    //now you have valid init value for slider
    setEffectiveValue(start);
...