package de.skuzzle.polly.tools.math; public final class MathUtil { public final static int limit(int num, int bound1, int bound2) { final int lowerBound = Math.min(bound1, bound2); final int upperBound = Math.max(bound1, bound2); return Math.max(lowerBound, Math.min(upperBound, num)); } public final static double limit(double num, double bound1, double bound2) { final double lowerBound = Math.min(bound1, bound2); final double upperBound = Math.max(bound1, bound2); return Math.max(lowerBound, Math.min(upperBound, num)); } public final static <T extends Comparable<T>> T limit(T elem, T bound1, T bound2) { final T lowerBound = min(bound1, bound2); final T upperBound = max(bound1, bound2); return max(lowerBound, min(upperBound, elem)); } public final static <T extends Comparable<T>> T max(T e1, T e2) { final int comp = e1.compareTo(e2); if (comp < 0) { return e2; } else { return e1; } } public final static <T extends Comparable<T>> T min(T e1, T e2) { final int comp = e1.compareTo(e2); if (comp < 0) { return e2; } else { return e1; } } public final static <T extends Comparable<T>> boolean between( T elem, T bound1, T bound2) { final T lowerBound = min(bound1, bound2); final T upperBound = max(bound1, bound2); return (elem.compareTo(lowerBound) >= 0) && (elem.compareTo(upperBound) <= 0); } public final static boolean between(int num, int bound1, int bound2) { final int lowerBound = Math.min(bound1, bound2); final int upperBound = Math.max(bound1, bound2); return num >= lowerBound && num <= upperBound; } public final static boolean between(double num, double bound1, double bound2) { final double lowerBound = Math.min(bound1, bound2); final double upperBound = Math.max(bound1, bound2); return num >= lowerBound && num <= upperBound; } // parse roman literals // from http://stackoverflow.com/a/9073310/2489557 public static int parseRoman(String romanNumber) { int decimal = 0; int lastNumber = 0; String romanNumeral = romanNumber.toUpperCase(); for (int x = romanNumeral.length() - 1; x >= 0 ; x--) { char convertToDecimal = romanNumeral.charAt(x); switch (convertToDecimal) { case 'M': decimal = processDecimal(1000, lastNumber, decimal); lastNumber = 1000; break; case 'D': decimal = processDecimal(500, lastNumber, decimal); lastNumber = 500; break; case 'C': decimal = processDecimal(100, lastNumber, decimal); lastNumber = 100; break; case 'L': decimal = processDecimal(50, lastNumber, decimal); lastNumber = 50; break; case 'X': decimal = processDecimal(10, lastNumber, decimal); lastNumber = 10; break; case 'V': decimal = processDecimal(5, lastNumber, decimal); lastNumber = 5; break; case 'I': decimal = processDecimal(1, lastNumber, decimal); lastNumber = 1; break; } } return decimal; } private static int processDecimal(int decimal, int lastNumber, int lastDecimal) { if (lastNumber > decimal) { return lastDecimal - decimal; } else { return lastDecimal + decimal; } } private MathUtil() {} }