1package aurelienribon.tweenengine.equations;
2
3import aurelienribon.tweenengine.TweenEquation;
4
5/**
6 * Easing equation based on Robert Penner's work:
7 * http://robertpenner.com/easing/
8 * @author Aurelien Ribon | http://www.aurelienribon.com/
9 */
10public abstract class Elastic extends TweenEquation {
11	private static final float PI = 3.14159265f;
12
13	public static final Elastic IN = new Elastic() {
14		@Override
15		public final float compute(float t) {
16			float a = param_a;
17			float p = param_p;
18			if (t==0) return 0;  if (t==1) return 1; if (!setP) p=.3f;
19			float s;
20			if (!setA || a < 1) { a=1; s=p/4; }
21			else s = p/(2*PI) * (float)Math.asin(1/a);
22			return -(a*(float)Math.pow(2,10*(t-=1)) * (float)Math.sin( (t-s)*(2*PI)/p ));
23		}
24
25		@Override
26		public String toString() {
27			return "Elastic.IN";
28		}
29	};
30
31	public static final Elastic OUT = new Elastic() {
32		@Override
33		public final float compute(float t) {
34			float a = param_a;
35			float p = param_p;
36			if (t==0) return 0;  if (t==1) return 1; if (!setP) p=.3f;
37			float s;
38			if (!setA || a < 1) { a=1; s=p/4; }
39			else s = p/(2*PI) * (float)Math.asin(1/a);
40			return a*(float)Math.pow(2,-10*t) * (float)Math.sin( (t-s)*(2*PI)/p ) + 1;
41		}
42
43		@Override
44		public String toString() {
45			return "Elastic.OUT";
46		}
47	};
48
49	public static final Elastic INOUT = new Elastic() {
50		@Override
51		public final float compute(float t) {
52			float a = param_a;
53			float p = param_p;
54			if (t==0) return 0;  if ((t*=2)==2) return 1; if (!setP) p=.3f*1.5f;
55			float s;
56			if (!setA || a < 1) { a=1; s=p/4; }
57			else s = p/(2*PI) * (float)Math.asin(1/a);
58			if (t < 1) return -.5f*(a*(float)Math.pow(2,10*(t-=1)) * (float)Math.sin( (t-s)*(2*PI)/p ));
59			return a*(float)Math.pow(2,-10*(t-=1)) * (float)Math.sin( (t-s)*(2*PI)/p )*.5f + 1;
60		}
61
62		@Override
63		public String toString() {
64			return "Elastic.INOUT";
65		}
66	};
67
68	// -------------------------------------------------------------------------
69
70	protected float param_a;
71	protected float param_p;
72	protected boolean setA = false;
73	protected boolean setP = false;
74
75	public Elastic a(float a) {
76		param_a = a;
77		this.setA = true;
78		return this;
79	}
80
81	public Elastic p(float p) {
82		param_p = p;
83		this.setP = true;
84		return this;
85	}
86}