Difference between revisions of "Interpolation"

From Second Life Wiki
Jump to navigation Jump to search
(Revising entire Interpolation Library to something like Geometric Library is)
Line 1: Line 1:
{{LSL Header}}
{{LSL Header}}
{{RightToc|clear:right;}}
== Interpolation Library ==
=== Float Functions ===
<!--############# FLOAT LINEAR #############-->
{|cellspacing="0" cellpadding="3" border="1" style="border: 1px solid #aaaaaa; margin: 1em 1em 1em 0pt; background-color: #ffffff; border-collapse: collapse" width="80%"
!style="color: #000000; background-color: #aaaaff;" height="20px"|
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>
{|cellspacing="0" cellpadding="3" border="1" style="border: 1px solid #aaaaaa; margin: 1em 1em 1em 0pt; background-color: #ffffff; border-collapse: collapse" width="80%"
|
{|cellspacing="0" cellpadding="6" border="1" style="border: 1px solid #aaaaaa; margin: 1em 1em 1em 0pt; background-color: #e0e0ff; border-collapse: collapse"
!style="background-color: #d0d0ee" | Input
!style="background-color: #d0d0ee" | Description
|-
| float f0
| Start, 0.0
|-
| float f1
| End, 1.0
|-
| float t
| Fraction of interpolation
|-
!style="background-color: #d0d0ee" | Output
!style="background-color: #d0d0ee" | Description
|-
| return float fLin
| Returns linear interpolation of two floats
|}
| Graph goes here, k.
|}
<div style="float:right;font-size: 80%;">
By Nexii Malthus</div>
|}
<!--############# FLOAT COSINE #############-->
{|cellspacing="0" cellpadding="3" border="1" style="border: 1px solid #aaaaaa; margin: 1em 1em 1em 0pt; background-color: #ffffff; border-collapse: collapse" width="80%"
!style="color: #000000; background-color: #aaaaff;" height="20px"|
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>
{|cellspacing="0" cellpadding="3" border="1" style="border: 1px solid #aaaaaa; margin: 1em 1em 1em 0pt; background-color: #ffffff; border-collapse: collapse" width="80%"
|
{|cellspacing="0" cellpadding="6" border="1" style="border: 1px solid #aaaaaa; margin: 1em 1em 1em 0pt; background-color: #e0e0ff; border-collapse: collapse"
!style="background-color: #d0d0ee" | Input
!style="background-color: #d0d0ee" | Description
|-
| float f0
| Start, 0.0
|-
| float f1
| End, 1.0
|-
| float t
| Fraction of interpolation
|-
!style="background-color: #d0d0ee" | Output
!style="background-color: #d0d0ee" | Description
|-
| return float fCos
| Returns cosine interpolation of two floats
|}
| Graph goes here, k.
|}
<div style="float:right;font-size: 80%;">
By Nexii Malthus</div>
|}
== Old non-documented Library ==
Changes/
Changes/
1.0-1.1 - Added rotation types
1.0-1.1 - Added rotation types

Revision as of 07:39, 5 October 2008

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>