# Interpolation/Spline/Vectors

 LSL Portal

## Contents

Function: vector pSpline( list v, float t, integer Loop );

B-Spline Interpolation between four vector points in a list of vectors that define a path.
Returns a vector

 • list v • float t – Ranges between [0, 1] • integer Loop – Whether the list is a curved line or loops into a closed shape.

## Specification

```vector pSpline(list v, float t, integer Loop) {
integer l = llGetListLength(v); t *= l-1;
integer f = llFloor(t); t -= f;
float t2 = t * t; float t3 = t2 * t;
return (
( (-t3 + (3.*t2) - (3.*t) + 1.) * llList2Vector(v, pIndex(f-1,l,Loop)) )
+ ( ((3.*t3) - (6.*t2) + 4.) * llList2Vector(v, pIndex(f,l,Loop)) )
+ ( ((-3.*t3) + (3.*t2) + (3.*t) + 1.) * llList2Vector(v, pIndex(f+1,l,Loop)) )
+ ( t3 * llList2Vector(v, pIndex(f+2,l,Loop)) )
) / 6.0;
}
integer pIndex( integer Index, integer Length, integer Loop) {
if(Loop) return Index % Length;
if(Index < 0) return 0;
if(Index > --Length) return Length;
return Index;
}
// Released into public domain. By Nexii Malthus.```

## Examples

```//Quick Dirty Example By To-mos Codewarrior (tomos.halsey)

vector pos_1;vector pos_2;
vector pos_3;vector pos_4;
vector pos_5;vector pos_6;
vector pos_7;

{
integer total=llGetNumberOfPrims()+1;
string name;
while((total--)-1)
{
if(name == "1")   LINK_1 = total;
if(name == "2")   LINK_2 = total;
if(name == "3")   LINK_3 = total;
if(name == "4")   LINK_4 = total;
if(name == "5")   LINK_5 = total;
if(name == "6")   LINK_6 = total;
if(name == "7")   LINK_7 = total;
}
}

getPositions()
{
}

vector bSpline(list v, float t, integer Loop) {
integer l = llGetListLength(v); t *= l-1;
integer f = llFloor(t); t -= f;
float t2 = t * t; float t3 = t2 * t;
vector out=(
( (-t3 + (3.*t2) - (3.*t) + 1.) * llList2Vector(v, pIndex(f-1,l,Loop)) )
+ ( ((3.*t3) - (6.*t2) + 4.) * llList2Vector(v, pIndex(f,l,Loop)) )
+ ( ((-3.*t3) + (3.*t2) + (3.*t) + 1.) * llList2Vector(v, pIndex(f+1,l,Loop)) )
+ ( t3 * llList2Vector(v, pIndex(f+2,l,Loop)) )
) / 6.0;
llSetText(
"time: "+(string)t+"\n"+
"vector pos: "+(string)out
,<1.0,1.0,1.0>,1.0);
return out;
}
integer pIndex( integer Index, integer Length, integer Loop) {
if(Loop) return Index % Length;
if(Index < 0) return 0;
if(Index > --Length) return Length;
return Index;
}

interpolate()
{
getPositions();

float t;
for(t = 0; t < 1; t += 0.001)
{