2D Interpolation Identification Help

42 Views Asked by At

I'm trying to identify an interpolation used. Can anyone help? I'm trying to figure out what the algorithm is doing. It basically has two interpolation parameters (PreviousMovementStepValue and CurrentMovementStepValue), and then interpolates over number steps from a start to end value (0.0 to 1.0). I need to know how it works so I can properly assign those interpolation parameters.

Here's the code:

    float PreviousMovementStepValue = 0.012189650000000000;
    float CurrentMovementStepValue = 0.000787947300000000;
    float NumberSteps = 150.0;
    float InverseNumberSteps = 1 / NumberSteps;
    float PreviousValue = 0.0;
    float TargetValue = 1.0;

    fprintf(outDebugPolynomials, "PreviousMovementStepValue %f CurrentMovementStepValue %f InverseNumberSteps %f PreviousValue %f TargetValue %f\n", PreviousMovementStepValue, CurrentMovementStepValue, InverseNumberSteps, PreviousValue, TargetValue);
    for (float MovementStep = 0; MovementStep <= NumberSteps; MovementStep += 0.5)
    {

        float interpolatedValue = ((((((((((pow(MovementStep, 3.0f)) * (pow(InverseNumberSteps, 2.0f))) * 2) * InverseNumberSteps) - ((3.0 * (pow(MovementStep, 2.0f))) * (pow(InverseNumberSteps, 2.0f)))) + 1.0) * PreviousValue) + (TargetValue * (((3.0 * (pow(MovementStep, 2.0f))) * (pow(InverseNumberSteps, 2.0f))) - ((((pow(MovementStep, 3.0f)) * (pow(InverseNumberSteps, 2.0f))) * 2) * InverseNumberSteps)))) + (PreviousMovementStepValue * (((((pow(MovementStep, 3.0f)) * (pow(InverseNumberSteps, 2.0f))) - ((pow(MovementStep, 2.0f)) * InverseNumberSteps)) - ((pow(MovementStep, 2.0f)) * InverseNumberSteps)) + MovementStep))) + (CurrentMovementStepValue * (((pow(MovementStep, 3.0f)) * (pow(InverseNumberSteps, 2.0f))) - ((pow(MovementStep, 2.0f)) * InverseNumberSteps))));

        fprintf(outDebugPolynomials, "%f:%f\n", MovementStep, interpolatedValue);
    }

Here's a slightly more readable version of the interpolation algorithm:

    float interpolatedValue = 
    (
    (
    (
    ((
    (
    ((((pow(MovementStep, 3.0f)) * (pow(InverseNumberSteps, 2.0f))) * 2) * InverseNumberSteps)
    - ((3.0 * (pow(MovementStep, 2.0f))) * (pow(InverseNumberSteps, 2.0f))))
    + 1.0) * PreviousValue)

    + 
    (TargetValue * (((3.0 * (pow(MovementStep, 2.0f))) * (pow(InverseNumberSteps, 2.0f))) 
    - ((((pow(MovementStep, 3.0f)) * (pow(InverseNumberSteps, 2.0f))) * 2) * InverseNumberSteps))
    )
    )

    +
    (PreviousMovementStepValue * (((((pow(MovementStep, 3.0f)) * (pow(InverseNumberSteps, 2.0f))) 
    - ((pow(MovementStep, 2.0f)) * InverseNumberSteps)) - ((pow(MovementStep, 2.0f)) * InverseNumberSteps)) + MovementStep))
    ) 

    + 
    (CurrentMovementStepValue * (((pow(MovementStep, 3.0f)) * (pow(InverseNumberSteps, 2.0f)))
    - ((pow(MovementStep, 2.0f)) * InverseNumberSteps)))
    );