05-07-2008 17:35
https://wiki.secondlife.com/wiki/Interpolation
Update: Added Hermite
From: someone

//===================================================//
// Interpolation Library 1.2 //
// "May 12 2008", "6:16:20 GMT-0" //
// Copyright (C) 2008, Nexii Malthus (cc-by) //
// http://creativecommons.org/licenses/by/3.0/ //
//===================================================//

float fLin(float v0, float v1,float t){
return v0*(1-t) + v1*t;}

float fCos(float v0,float v1,float t){
float F = (1 - llCos(t*PI))/2;
return v0*(1-F)+v1*F;}

float fCub(float v0,float v1,float v2,float v3,float t){
float P = (v3-v2)-(v0-v1);float Q = (v0-v1)-P;float R = v2-v0;float S = v1;
return P*llPow(t,3) + Q*llPow(t,2) + R*t + S;}

float fHem(float v0,float v1,float v2,float v3,float t,float tens,float bias){
float t2 = t*t;float t3 = t2*t;
float a0 = (v1-v0)*(1+bias)*(1-tens)/2;
a0 += (v2-v1)*(1-bias)*(1-tens)/2;
float a1 = (v2-v1)*(1+bias)*(1-tens)/2;
a1 += (v3-v2)*(1-bias)*(1-tens)/2;
float b0 = 2*t3 - 3*t2 + 1;
float b1 = t3 - 2*t2 + t;
float b2 = t3 - t2;
float b3 = -2*t3 + 3*t2;
return ( b0 * v1+b1 * a0+b2 * a1+b3 * v2 );}

vector vLin(vector v0, vector v1,float t){
return v0*(1-t) + v1*t;}

vector vCos(vector v0,vector v1,float t){
float F = (1 - llCos(t*PI))/2;
return v0*(1-F)+v1*F;}

vector vCub(vector v0,vector v1,vector v2,vector v3,float t){
vector P = (v3-v2)-(v0-v1);vector Q = (v0-v1)-P;vector R = v2-v0;vector S = v1;
return P*llPow(t,3) + Q*llPow(t,2) + R*t + S;}

vector vHem(vector v0,vector v1,vector v2,vector v3,float t,float tens,float bias){
float t2 = t*t;float t3 = t2*t;
vector a0 = (v1-v0)*(1+bias)*(1-tens)/2;
a0 += (v2-v1)*(1-bias)*(1-tens)/2;
vector a1 = (v2-v1)*(1+bias)*(1-tens)/2;
a1 += (v3-v2)*(1-bias)*(1-tens)/2;
float b0 = 2*t3 - 3*t2 + 1;
float b1 = t3 - 2*t2 + t;
float b2 = t3 - t2;
float b3 = -2*t3 + 3*t2;
return ( b0 * v1+b1 * a0+b2 * a1+b3 * v2 );}

rotation rLin(rotation r0,rotation r1,float t){
// Spherical-Linear Interpolation
float ang = llAngleBetween(r0, r1);
if( ang > PI) ang -= TWO_PI;
return r0 * llAxisAngle2Rot( llRot2Axis(r1/r0)*r0, ang*t);}

rotation rCos(rotation r0,rotation r1,float t){
// Spherical-Cosine Interpolation
float f = (1 - llCos(t*PI))/2;
float ang = llAngleBetween(r0, r1);
if( ang > PI) ang -= TWO_PI;
return r0 * llAxisAngle2Rot( llRot2Axis(r1/r0)*r0, ang*f);}

rotation rCub(rotation r0,rotation r1,rotation r2,rotation r3,float t){
// Spherical-Cubic Interpolation
// r0 = Start, r1 = End, r2 and r3 affect path of curve!
return rLin( rLin(r0,r1,t), rLin(r2,r3,t), 2*t*(1-t) );}

default{state_entry(){}}

_____________________

Geometric Library, for all your 3D maths needs.
https://wiki.secondlife.com/wiki/Geometric

Creator of the Vertical Life Client