Я нашел решение с помощью некоторого стекопотока и удачи. Зачем это вообще нужно? Потому что это необходимо на этапе инициализации ползунка 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);