unit noise;

{$ifdef fpc}
  {$mode delphi}
{$endif}

interface

uses
  Classes, SysUtils; 

function IntNoise(x: Integer): Double;

function Linear_Interpolate(a, b, x: Double): Double;
function Cosine_Interpolate(a, b, x: Double): Double;
function Cubic_Interpolate(v0, v1, v2, v3, x: Double): Double;

implementation

function IntNoise(x: Integer): Double;
var
  xl: Integer;
begin
  xl := (x shl 13) xor x;
  Result := (xl * (xl * xl * 15731 + 789221) + 1376312589) and $7fffffff;
  Result := 1.0 - (Result / 1073741824.0);
end;

function Linear_Interpolate(a, b, x: Double): Double;
begin
  Result := a * (1-x) + b * x;
end;

function Cosine_Interpolate(a, b, x: Double): Double;
var
  f, ft: Double;
begin
  ft := x * Pi;
  f := (1.0 - cos(ft)) * 0.5;
  Result := a * (1 - f) + b * f;
end;
  
function Cubic_Interpolate(v0, v1, v2, v3, x: Double): Double;
var
  P, Q, R, S: Double;
begin
  P := (v3 - v2) - (v0 - v1);
  Q := (v0 - v1) - P;
  R := v2 - v0;
  S := v1;

  Result := P * x * x * x + Q * x * x + R * x + S;
end;

end.