MathTools.java
package eu.javaexperience.math;
import java.util.List;
public class MathTools
{
public static int clamp(int min, int value, int max)
{
if(max < min)
{
int tmp = min;
min = max;
max = tmp;
}
if(value < min)
{
value = min;
}
if(value > max)
{
value = max;
}
return value;
}
//TODO this can be inaccurate (wrong) when dealing with BigDecimal
public static boolean inRange(Number Reference, Number Check, Number Range)
{
if(null == Reference || null == Check)
{
return false;
}
double range = 0.0;
if(null != Range)
{
range = Range.doubleValue();
}
double ref = Reference.doubleValue();
double check = Check.doubleValue();
return check-range <= ref && ref <= check+range;
}
//TODO this can be inaccurate (wrong) when dealing with BigDecimal
public static boolean inRelativeRange(Number Reference, Number Check, Number RangePercent)
{
if(null == Reference || null == Check)
{
return false;
}
double range = 0.0;
double ref = Reference.doubleValue();
double check = Check.doubleValue();
if(null != RangePercent)
{
range = RangePercent.doubleValue()*ref;
}
return check-range <= ref && ref <= check+range;
}
public static boolean inRange(long ref, long check, long range)
{
return check-range <= ref && ref <= check+range;
}
/**
*
* @param ids
* @return highest values in array or Integer.MIN_VAL
*/
public static int getMax(int[] ids)
{
int ret = Integer.MIN_VALUE;
for(int i=0;i<ids.length;++i)
{
int val = ids[i];
if(ret < val)
{
ret = val;
}
}
return ret;
}
//TODO use Number interface which is comparable
public static Long getMaxLong(List<? extends Number> lst)
{
boolean assigned = false;
long ret = 0;
for(Number n: lst)
{
if(null != n)
{
if(!assigned)
{
ret = n.longValue();
assigned = true;
}
else
{
long l = n.longValue();
if(ret < l)
{
ret = l;
}
}
}
}
return assigned?ret:null;
}
public static double clamp(double min, double value, double max)
{
if(max < min)
{
double tmp = min;
min = max;
max = tmp;
}
if(value < min)
{
value = min;
}
if(value > max)
{
value = max;
}
return value;
}
public static Double sawTeeth(double min, double step, double max, double val)
{
return MathTools.clamp(min, min+ ((val*step) % ((max-min)+1)), max);
}
public static int linearSawteethBetween(int min, int intValue, int max)
{
//clamp is for possible negative numbers
return MathTools.clamp(min, min+ (intValue % ((max-min)+1)), max);
}
public static int randomBetween(int min, int max)
{
return (int) (min+Math.random()*(max-min));
}
}