Interpolation

From Second Life Wiki
Revision as of 07:39, 5 October 2008 by Nexii Malthus (talk | contribs) (Revising entire Interpolation Library to something like Geometric Library is)
Jump to navigation Jump to search

Interpolation Library

Float Functions

Linear

Linear interpolation of f0 and f1 with fraction t. <lsl> float fLin(float f0, float f1,float t){

   return f0*(1-t) + f1*t;}

</lsl>

Input Description
float f0 Start, 0.0
float f1 End, 1.0
float t Fraction of interpolation
Output Description
return float fLin Returns linear interpolation of two floats
Graph goes here, k.
By Nexii Malthus

Cosine

Cosine interpolation of f0 and f1 with fraction t. <lsl> float fCos(float v0,float v1,float t){

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

</lsl>

Input Description
float f0 Start, 0.0
float f1 End, 1.0
float t Fraction of interpolation
Output Description
return float fCos Returns cosine interpolation of two floats
Graph goes here, k.
By Nexii Malthus



Old non-documented Library

Changes/ 1.0-1.1 - Added rotation types 1.1-1.2 - Added Hermite for float and vector

Example Script

<lsl> //===================================================// // 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(){}}

</lsl>