Advertisement
Barteks2x

Untitled

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