Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- private UIComponent<?> makeExponentialSlider(String name, float min, float max, float defaultVal) {
- final float baseValue = 2;
- UISlider<Float> slider = new UISlider<>(this, this.width - 32, Converter.from(
- x -> getExponentialSliderValue(min, max, baseValue, x),
- x -> getExponentialSliderReverse(min, max, baseValue, x)
- ), name)
- .setPosition(0, 16)
- .setValue(defaultVal);
- return slider;
- }
- private float getExponentialSliderReverse(float min, float max, float baseValue, Float x) {
- float exp = (float) (log(x)/log(baseValue));
- float offset = (exp - min)/(max - min);
- return offset;
- }
- private float getExponentialSliderValue(float min, float max, float baseValue, Float x) {
- // try to snap to number divisible by the highest power of base number that is within distance of 1 pixel
- // for non-integer values (negative exponent)... it will probably do something useful anyway
- final double prevVal = pow(baseValue, x);
- final double snapSize = (1.0f/this.width)*(max - min)*0.5;
- int startExponent = MathHelper.ceil(max);
- for (int trySnapDivExp = startExponent; ; trySnapDivExp--) {
- double divisor = pow(baseValue, trySnapDivExp);
- if (divisor == 0) {
- return (float) prevVal;
- }
- double snapVal = round(prevVal/divisor)*divisor;
- if (Double.isNaN(snapVal) || Double.isInfinite(snapVal)) {
- return (float) prevVal;
- }
- double snapExp = log(snapVal)/log(baseValue);
- double snapExpToExpDist = abs(x - snapExp);
- if (snapExpToExpDist < snapSize) {
- return (float) snapVal;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement