簡體   English   中英

如何反轉滑塊的 ln 冪函數?

[英]How do I reverse this ln power function of a slider?

我能夠從 Helmut Sennewald 的 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;
}

我在一些 stackoverflow 和運氣的幫助下找到了解決方案。 為什么甚至需要這個? 因為在對數滑塊的初始化階段需要它。 這里有方法和示例使用。用戶給出了對數刻度的初始值。 它仍然只是想要的價值而不是真實的。 要獲得有效值,必須首先將所需值反向映射為滑塊上的等效線性值,然后饋入正向對數映射。 這會產生良好而流暢的全方位滑塊體驗。

//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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM