/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package cubicsplines;
/**
*
* @author Adam
*/
public class Cubic {
public boolean cordsDebug, lerpDebug;
double FREQ = 0.05f;
private double A,B,C,D,E,F,G,H;
private float lastPositionTime;
// Interpolated values along the spline
public float xPos,yPos;
public void addNewPosition(
float fromPosX,
float fromPosY,
float toPosX,
float toPosY,
float fromVelX,
float fromVelY,
float toVelX,
float toVelY)
{
float currTime = (float) CubicSpline.getTime();
float timeDiff = currTime - lastPositionTime;
// Calculate change in acceleration
float accelerationX = toVelX - fromVelX;
float accelerationY = toVelX - fromVelY;
// Coordinate 1 = starting position
float x0 = fromPosX;
float y0 = fromPosY;
// Coordinate 2 - Position after 1 second using starting velocity = Coordinate1 + StartVelocity
float x1 = fromPosX + fromVelX;
float y1 = fromPosY + fromVelY;
// Coordinate 3 - Position after 1 second using reversed ending velocity = Coordinate4 – EndVelocity
float x2 = (float) ((toPosX + toVelX * timeDiff) + (0.9 * accelerationX * (timeDiff * timeDiff)));
float y2 = (float) ((toPosY + toVelY * timeDiff) + (0.9 * accelerationY * (timeDiff * timeDiff)));
// Coordinate 4 = Ending position
float x3 = x2 - (toVelX + accelerationX * timeDiff);
float y3 = y2 - (toVelY + accelerationX * timeDiff);
A = x3 - (3*x2) + (3*x1) - x0;
B = (3*x2) - (6*x1) + (3*x0);
C = (3*x1) - (3*x0);
D = x0;
E = y3 - (3*y2) + (3*y1) - y0;
F = (3*y2) - (6*y1) + (3*y0);
G = (3*y1) - (3*y0);
H = y0;
if(cordsDebug)
{
System.out.println("----------------------------");
System.out.println("currTime: " + currTime);
System.out.println("From Velocity" + fromVelX + " | " + fromVelY);
System.out.println("To Velocity" + toVelX + " | " + toVelY);
System.out.println("Coordinate 1: " + x0 + " | " + y0);
System.out.println("Coordinate 2: " + x1 + " | " + y1);
System.out.println("Coordinate 3: " + x2 + " | " + y2);
System.out.println("Coordinate 4: " + x3 + " | " + y3);
}
lastPositionTime = currTime;
}
// This function is called outside this class on each game tick
public void follow()
{
double curTime = CubicSpline.getTime();
//Time since last update
double timeSince = curTime - lastPositionTime;
double t = timeSince / FREQ;
if (t >= 0.0f && t <= 1.0f)
{
xPos = (float) (A*Math.pow(t,3) + B*Math.pow(t,2) + C*t + D);
yPos = (float) (E*Math.pow(t,3) + F*Math.pow(t,2) + G*t + H);
if(lerpDebug)
{
System.out.println("Pos: " + xPos + " | " + yPos);
}
}
}
}