1 package net.sf.josceleton.commons.util;
2
3
4
5
6 public final class MathUtil {
7
8 private MathUtil() {
9
10 }
11
12
13
14
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
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
30
31 final double expAdjustedPercent = Math.pow(percent - 1.0d, 3.0d) + 1.0d;
32
33 int diffToChange = (int) (diff * expAdjustedPercent);
34 if(startValue > endValue) {
35 diffToChange *= -1;
36 }
37
38 return startValue + diffToChange;
39 }
40
41
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
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 }