aboutsummaryrefslogtreecommitdiff
path: root/java/api/src/aurelienribon/tweenengine/equations/Elastic.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/api/src/aurelienribon/tweenengine/equations/Elastic.java')
-rwxr-xr-xjava/api/src/aurelienribon/tweenengine/equations/Elastic.java86
1 files changed, 86 insertions, 0 deletions
diff --git a/java/api/src/aurelienribon/tweenengine/equations/Elastic.java b/java/api/src/aurelienribon/tweenengine/equations/Elastic.java
new file mode 100755
index 0000000..925993d
--- /dev/null
+++ b/java/api/src/aurelienribon/tweenengine/equations/Elastic.java
@@ -0,0 +1,86 @@
+package aurelienribon.tweenengine.equations;
+
+import aurelienribon.tweenengine.TweenEquation;
+
+/**
+ * Easing equation based on Robert Penner's work:
+ * http://robertpenner.com/easing/
+ * @author Aurelien Ribon | http://www.aurelienribon.com/
+ */
+public abstract class Elastic extends TweenEquation {
+ private static final float PI = 3.14159265f;
+
+ public static final Elastic IN = new Elastic() {
+ @Override
+ public final float compute(float t) {
+ float a = param_a;
+ float p = param_p;
+ if (t==0) return 0; if (t==1) return 1; if (!setP) p=.3f;
+ float s;
+ if (!setA || a < 1) { a=1; s=p/4; }
+ else s = p/(2*PI) * (float)Math.asin(1/a);
+ return -(a*(float)Math.pow(2,10*(t-=1)) * (float)Math.sin( (t-s)*(2*PI)/p ));
+ }
+
+ @Override
+ public String toString() {
+ return "Elastic.IN";
+ }
+ };
+
+ public static final Elastic OUT = new Elastic() {
+ @Override
+ public final float compute(float t) {
+ float a = param_a;
+ float p = param_p;
+ if (t==0) return 0; if (t==1) return 1; if (!setP) p=.3f;
+ float s;
+ if (!setA || a < 1) { a=1; s=p/4; }
+ else s = p/(2*PI) * (float)Math.asin(1/a);
+ return a*(float)Math.pow(2,-10*t) * (float)Math.sin( (t-s)*(2*PI)/p ) + 1;
+ }
+
+ @Override
+ public String toString() {
+ return "Elastic.OUT";
+ }
+ };
+
+ public static final Elastic INOUT = new Elastic() {
+ @Override
+ public final float compute(float t) {
+ float a = param_a;
+ float p = param_p;
+ if (t==0) return 0; if ((t*=2)==2) return 1; if (!setP) p=.3f*1.5f;
+ float s;
+ if (!setA || a < 1) { a=1; s=p/4; }
+ else s = p/(2*PI) * (float)Math.asin(1/a);
+ if (t < 1) return -.5f*(a*(float)Math.pow(2,10*(t-=1)) * (float)Math.sin( (t-s)*(2*PI)/p ));
+ return a*(float)Math.pow(2,-10*(t-=1)) * (float)Math.sin( (t-s)*(2*PI)/p )*.5f + 1;
+ }
+
+ @Override
+ public String toString() {
+ return "Elastic.INOUT";
+ }
+ };
+
+ // -------------------------------------------------------------------------
+
+ protected float param_a;
+ protected float param_p;
+ protected boolean setA = false;
+ protected boolean setP = false;
+
+ public Elastic a(float a) {
+ param_a = a;
+ this.setA = true;
+ return this;
+ }
+
+ public Elastic p(float p) {
+ param_p = p;
+ this.setP = true;
+ return this;
+ }
+} \ No newline at end of file