import java.util.HashMap; class Smoothing{ HashMap types; int count=13; String[] typeNames=new String[]{"linear", "quadIn","quadOut","quadInOut", "cubicIn","cubicOut","cubicInOut", "exIn","exOut","exInOut", "sinIn","sinOut","sinInOut"}; Smoothing(){ types=new HashMap(13); for(int i=0;i<13;i++) types.put(typeNames[i],i); } float fn(String type,float x,float range){ return fn(type,x/range)*range; } float fn(int type,float x,float range){ return fn(type,x/range)*range; } float fn(String type,float x){ if(types.containsKey(type)) return fn(((Number)(types.get(type))).intValue(),x); return 0; //type not found } float fn(int type,float x){ switch(type){ case 0: return linear(x); case 1: return quadIn(x); case 2: return quadOut(x); case 3: return quadInOut(x); case 4: return cubicIn(x); case 5: return cubicOut(x); case 6: return cubicInOut(x); case 7: return exIn(x); case 8: return exOut(x); case 9: return exInOut(x); case 10: return sinIn(x); case 11: return sinOut(x); case 12: return sinInOut(x); } return 0; } String nameForFn(int f){ return typeNames[f]; } float linear(float x){ return x; } float quadIn(float x){ return x*x; } float quadOut(float x){ x=1-x; return 1-x*x; } float quadInOut(float x){ if(x<0.5) return quadIn(x*2)/2; return quadOut((x-0.5)*2)/2+0.5; } float cubicIn(float x){ return x*x*x; } float cubicOut(float x){ x=1-x; return 1-x*x*x; } float cubicInOut(float x){ if(x<0.5) return cubicIn(x*2)/2; return cubicOut((x-0.5)*2)/2+0.5; } float exIn(float x){ return pow(2.71828183,(x-1)*8); } float exOut(float x){ return 1-exIn(1-x); } float exInOut(float x){ if(x<0.5) return exIn(x*2)/2; return exOut((x-0.5)*2)/2+0.5; } float sinIn(float x){ return 1-cos(x*PI/2); } float sinOut(float x){ return sin(x*PI/2); } float sinInOut(float x){ if(x<0.5) return sinIn(x*2)/2; return sinOut((x-0.5)*2)/2+0.5; } }