Advertisement
Barteks2x

Untitled

Dec 21st, 2016
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 1.57 KB | None | 0 0
  1.     private UIComponent<?> makeExponentialSlider(String name, float min, float max, float defaultVal) {
  2.         final float baseValue = 2;
  3.         UISlider<Float> slider = new UISlider<Float>(this, this.width - 32, Converter.from(
  4.             x -> getExponentialSliderValue(min, max, baseValue, x*(max - min) + min),
  5.             x -> getExponentialSliderReverse(min, max, baseValue, x)
  6.         ), name)
  7.             .setPosition(0, 16)
  8.             .setValue(defaultVal);
  9.         return slider;
  10.     }
  11.  
  12.     private float getExponentialSliderReverse(float min, float max, float baseValue, float x) {
  13.         float exp = (float) (log(x)/log(baseValue));
  14.         float offset = (exp - min)/(max - min);
  15.         return offset;
  16.     }
  17.  
  18.     private float getExponentialSliderValue(float min, float max, float baseValue, float x) {
  19.         // try to snap to number divisible by the highest power of base number that is within distance of 1 pixel
  20.         // for non-integer values (negative exponent)... it will probably do something useful anyway
  21.         final double prevVal = pow(baseValue, x);
  22.         final double snapSize = (1.0f/this.width)*(max - min)*0.5;
  23.         int startExponent = MathHelper.ceil(max);
  24.         for (int trySnapDivExp = startExponent; ; trySnapDivExp--) {
  25.             double divisor = pow(baseValue, trySnapDivExp);
  26.             if (divisor == 0) {
  27.                 return (float) prevVal;
  28.             }
  29.             double snapVal = round(prevVal/divisor)*divisor;
  30.             if (Double.isNaN(snapVal) || Double.isInfinite(snapVal)) {
  31.                 return (float) prevVal;
  32.             }
  33.             double snapExp = log(snapVal)/log(baseValue);
  34.             double snapExpToExpDist = abs(x - snapExp);
  35.             if (snapExpToExpDist < snapSize) {
  36.                 return (float) snapVal;
  37.             }
  38.         }
  39.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement