View Javadoc

1   package net.sf.josceleton.commons.util;
2   
3   /**
4    * @since 0.4
5    */
6   public final class MathUtil {
7   	
8   	private MathUtil() {
9           // utility class should not be instantiable
10  	}
11  
12  
13  	/**
14  	 * @since 0.4
15  	 */
16  	public static int checkForMinOrMax(final int limit, final int value, final boolean forMin) {
17  		if(forMin == true) {
18  			return Math.min(limit, value);
19  		}
20  		return Math.max(limit, value);
21  	}
22  	
23  	/**
24  	 * @since 0.4
25  	 */
26  	public static int computeCubicEaseOut(final float percent, final int startValue, final int endValue) {
27          final int diff = Math.abs(endValue - startValue);
28          
29          // thanks to: http://www.dishevelled.org/interpolate/
30  //      final double expAdjustedPercent = -1.0d * percent * (percent - 2.0d); // ease out quadratic
31          final double expAdjustedPercent = Math.pow(percent - 1.0d, 3.0d) + 1.0d; // ease out cubic
32          
33          int diffToChange = (int) (diff * expAdjustedPercent);
34          if(startValue > endValue) {
35                  diffToChange *= -1;
36          }
37          
38          return startValue + diffToChange;
39  	}
40  	/**
41  	 * @since 0.4
42  	 */
43  	public static int relativateTo(final StartEnd real, final int realValue,
44                  final StartEnd expected) {
45  
46          final int diffExpected = Math.abs(expected.start() - expected.end());
47          final double diffRealPercentExpectedAdjusted = MathUtil.calcDiffRealPercentExpectedAdjusted(
48          		real, realValue, expected.start() < expected.end());
49          
50          return (int) Math.round(diffExpected * diffRealPercentExpectedAdjusted);
51  	}
52  
53  	private static double calcDiffRealPercentExpectedAdjusted(final StartEnd real,
54                  final int realValue, final boolean expectedStartLower) {
55          final double diffRealPercent = MathUtil.calcDiffRealPercent(real, realValue);
56          final double diffRealPercentExpectedAdjusted;
57          
58          if(expectedStartLower) {
59                  diffRealPercentExpectedAdjusted = diffRealPercent;
60          } else {
61                  diffRealPercentExpectedAdjusted = 1 - diffRealPercent;
62          }
63          
64          return diffRealPercentExpectedAdjusted;
65  	}
66  
67  	private static double calcDiffRealPercent(final StartEnd real, final int realValue) {
68          final int diffReal = Math.abs(real.start() - real.end());
69          final int realAdjustedValue = MathUtil.calcRealAdjustedValue(real, realValue);
70          
71          final int realMin = Math.min(real.start(), real.end());
72          
73          final double diffRealPercent;
74          if(real.start() < real.end()) {
75                  diffRealPercent = (realAdjustedValue - realMin) / ((double) diffReal);
76          } else {
77                  diffRealPercent = 1.0d - (realAdjustedValue - realMin) / ((double) diffReal);
78          }
79          
80          return diffRealPercent;
81  	}
82  
83  	private static int calcRealAdjustedValue(final StartEnd real, final int realValue) {
84          final int realAdjustedValue;
85          final int realMin = Math.min(real.start(), real.end());
86          final int realMax = Math.max(real.start(), real.end());
87          
88          if(realValue < realMin) {
89                  realAdjustedValue = realMin;
90          } else if(realValue > realMax) {
91                  realAdjustedValue = realMax;
92          } else {
93                  realAdjustedValue = realValue;
94          }
95          return realAdjustedValue;
96  	}
97  	
98  	/**
99  	 * @since 0.4
100 	 */
101 	public static class StartEnd {
102 		
103 		private final int start;
104 		private final int end;
105 		
106 		public StartEnd(final int start, final int end) {
107 			this.start = start;
108 			this.end = end;
109 		}
110 		
111 		final int start() {
112 			return this.start;
113 		}
114 		
115 		final int end() {
116 			return this.end;
117 		}
118 	}
119 
120 }