package com.kreative.paint.material.shape; import java.util.Collections; import java.util.HashMap; import java.util.Map; public abstract class Function { public abstract double eval(double v); public static final Function pos = new Function() { @Override public double eval(double v) { return +v; } }; public static final Function neg = new Function() { @Override public double eval(double v) { return -v; } }; public static final Function bool = new Function() { @Override public double eval(double v) { return (v != 0) ? 1 : 0; } }; public static final Function not = new Function() { @Override public double eval(double v) { return (v != 0) ? 0 : 1; } }; public static final Function abs = new Function() { @Override public double eval(double v) { return Math.abs(v); } }; public static final Function signum = new Function() { @Override public double eval(double v) { return Math.signum(v); } }; public static final Function ceil = new Function() { @Override public double eval(double v) { return Math.ceil(v); } }; public static final Function floor = new Function() { @Override public double eval(double v) { return Math.floor(v); } }; public static final Function round = new Function() { @Override public double eval(double v) { return Math.round(v); } }; public static final Function trunc = new Function() { @Override public double eval(double v) { if (v < 0) return Math.ceil(v); else return Math.floor(v); } }; public static final Function frac = new Function() { @Override public double eval(double v) { if (v < 0) return v - Math.ceil(v); else return v - Math.floor(v); } }; public static final Function toDegrees = new Function() { @Override public double eval(double v) { return Math.toDegrees(v); } }; public static final Function toRadians = new Function() { @Override public double eval(double v) { return Math.toRadians(v); } }; public static final Function sqrt = new Function() { @Override public double eval(double v) { return Math.sqrt(v); } }; public static final Function cbrt = new Function() { @Override public double eval(double v) { return Math.cbrt(v); } }; public static final Function qtrt = new Function() { @Override public double eval(double v) { return Math.sqrt(Math.sqrt(v)); } }; public static final Function sq = new Function() { @Override public double eval(double v) { return v * v; } }; public static final Function cb = new Function() { @Override public double eval(double v) { return v * v * v; } }; public static final Function qt = new Function() { @Override public double eval(double v) { return v * v * v * v; } }; public static final Function log = new Function() { @Override public double eval(double v) { return Math.log(v); } }; public static final Function log2 = new Function() { @Override public double eval(double v) { return Math.log(v) / Math.log(2); } }; public static final Function log10 = new Function() { @Override public double eval(double v) { return Math.log10(v); } }; public static final Function log1p = new Function() { @Override public double eval(double v) { return Math.log1p(v); } }; public static final Function exp = new Function() { @Override public double eval(double v) { return Math.exp(v); } }; public static final Function exp2 = new Function() { @Override public double eval(double v) { return Math.pow(2, v); } }; public static final Function exp10 = new Function() { @Override public double eval(double v) { return Math.pow(10, v); } }; public static final Function expm1 = new Function() { @Override public double eval(double v) { return Math.expm1(v); } }; public static final Function sin = new Function() { @Override public double eval(double v) { return Math.sin(v); } }; public static final Function cos = new Function() { @Override public double eval(double v) { return Math.cos(v); } }; public static final Function tan = new Function() { @Override public double eval(double v) { return Math.tan(v); } }; public static final Function cot = new Function() { @Override public double eval(double v) { return 1 / Math.tan(v); } }; public static final Function sec = new Function() { @Override public double eval(double v) { return 1 / Math.cos(v); } }; public static final Function csc = new Function() { @Override public double eval(double v) { return 1 / Math.sin(v); } }; public static final Function asin = new Function() { @Override public double eval(double v) { return Math.asin(v); } }; public static final Function acos = new Function() { @Override public double eval(double v) { return Math.acos(v); } }; public static final Function atan = new Function() { @Override public double eval(double v) { return Math.atan(v); } }; public static final Function acot = new Function() { @Override public double eval(double v) { return Math.atan(1 / v); } }; public static final Function asec = new Function() { @Override public double eval(double v) { return Math.acos(1 / v); } }; public static final Function acsc = new Function() { @Override public double eval(double v) { return Math.asin(1 / v); } }; public static final Function sinh = new Function() { @Override public double eval(double v) { return Math.sinh(v); } }; public static final Function cosh = new Function() { @Override public double eval(double v) { return Math.cosh(v); } }; public static final Function tanh = new Function() { @Override public double eval(double v) { return Math.tanh(v); } }; public static final Function coth = new Function() { @Override public double eval(double v) { return 1 / Math.tanh(v); } }; public static final Function sech = new Function() { @Override public double eval(double v) { return 1 / Math.cosh(v); } }; public static final Function csch = new Function() { @Override public double eval(double v) { return 1 / Math.sinh(v); } }; public static final Function asinh = new Function() { @Override public double eval(double v) { return Math.log(v + Math.sqrt(v * v + 1)); } }; public static final Function acosh = new Function() { @Override public double eval(double v) { return Math.log(v + Math.sqrt(v + 1) * Math.sqrt(v - 1)); } }; public static final Function atanh = new Function() { @Override public double eval(double v) { return (Math.log(1 + v) - Math.log(1 - v)) / 2; } }; public static final Function acoth = new Function() { @Override public double eval(double v) { return (Math.log(1 + 1/v) - Math.log(1 - 1/v)) / 2; } }; public static final Function asech = new Function() { @Override public double eval(double v) { return Math.log(1/v + Math.sqrt(1/v + 1) * Math.sqrt(1/v - 1)); } }; public static final Function acsch = new Function() { @Override public double eval(double v) { return Math.log(1/v + Math.sqrt(1 + 1 / (v * v))); } }; public static final Map<String,Function> functions; static { Map<String,Function> f = new HashMap<String,Function>(); f.put("pos", pos); f.put("neg", neg); f.put("bool", bool); f.put("not", not); f.put("abs", abs); f.put("sgn", signum); f.put("signum", signum); f.put("ceil", ceil); f.put("floor", floor); f.put("round", round); f.put("trunc", trunc); f.put("frac", frac); f.put("todeg", toDegrees); f.put("todegrees", toDegrees); f.put("torad", toRadians); f.put("toradians", toRadians); f.put("sqrt", sqrt); f.put("cbrt", cbrt); f.put("qtrt", qtrt); f.put("sq", sq); f.put("cb", cb); f.put("qt", qt); f.put("ln", log); f.put("log", log); f.put("log2", log); f.put("log10", log10); f.put("ln1", log1p); f.put("ln1p", log1p); f.put("log1", log1p); f.put("log1p", log1p); f.put("exp", exp); f.put("exp2", exp2); f.put("exp10", exp10); f.put("exp1", expm1); f.put("expm1", expm1); f.put("sin", sin); f.put("cos", cos); f.put("tan", tan); f.put("cot", cot); f.put("sec", sec); f.put("csc", csc); f.put("asin", asin); f.put("acos", acos); f.put("atan", atan); f.put("acot", acot); f.put("asec", asec); f.put("acsc", acsc); f.put("sinh", sinh); f.put("cosh", cosh); f.put("tanh", tanh); f.put("coth", coth); f.put("sech", sech); f.put("csch", csch); f.put("asinh", asinh); f.put("acosh", acosh); f.put("atanh", atanh); f.put("acoth", acoth); f.put("asech", asech); f.put("acsch", acsch); f.put("+", pos); f.put("-", neg); f.put("!!", bool); f.put("!", not); f.put("\u221A", sqrt); f.put("\u221B", cbrt); f.put("\u221C", qtrt); functions = Collections.unmodifiableMap(f); } }