unit math3d;
interface
uses types3d,opengl;


function CubicIPol(A0,A1,A2,A3,X: GLfloat): GLfloat;
function LinIPol(A1,A2,X: GLfloat): GLfloat;
function CosIPol(A1,A2,X: GLfloat): GLfloat;
procedure Normalize(var Vector: TCoord3D);
procedure CalcNormal(P1,P2,P3: TCoord3D; var Res: TCoord3D);
function Interval(A,Min,Max: GLfloat): GLfloat;

implementation


function CubicIPol(A0,A1,A2,A3,X: GLfloat): GLfloat;
var P,Q,R,S: GLfloat;
begin
  P:=(A3-A2) - (A0-A1);
  Q:=(A0-A1) - P;
  R:=A2-A0;
  S:=A1;

  CubicIPol:=P*X*X*X + Q*X*X + R*X + S;
end;

function LinIPol(A1,A2,X: GLfloat): GLfloat;
begin
 LinIPol:=(A1*(1-X) + A2*(X));
end;

function CosIPol(A1,A2,X: GLfloat): GLfloat;
var F: GLfloat;
begin
 F:=(1-Cos(X*PI))/2;
 CosIPol:=A1*(1-F)+A2*F;
end;

procedure Normalize(var Vector: TCoord3D);
var Len: GLfloat;
begin
  Len:=SQRT(  SQR(Vector.X)+SQR(Vector.Y)+SQR(Vector.Z)  ); //dlzka vektora
   if Len=0 then Exit;
  Vector.X:=Vector.X/Len;  //vypocet normalizovaneho (<0,1>) vektora
  Vector.Y:=Vector.Y/Len;
  Vector.Z:=Vector.Z/Len;
end;

procedure CalcNormal(P1,P2,P3: TCoord3D; var Res: TCoord3D);
var V1,V2: TCoord3D;
begin
  //vypocitanie dvoch vektorov roviny v ktorej trojuholnik lezi
  V1.X:=P1.X - P2.X;
  V1.Y:=P1.Y - P2.Y;
  V1.Z:=P1.Z - P2.Z;

  V2.X:=P2.X - P3.X;
  V2.Y:=P2.Y - P3.Y;
  V2.Z:=P2.Z - P3.Z;

  //vektorovy sucin
  Res.X:=V1.Y*V2.Z - V1.Z*V2.Y;
  Res.Y:=V1.Z*V2.X - V1.X*V2.Z;
  Res.Z:=V1.X*V2.Y - V1.Y*V2.X;

  Normalize(Res);
end;

function Interval(A,Min,Max: GLfloat): GLfloat;
begin
 if A<Min then Result:=Min
 else
 if A>Max then Result:=Max
 else
 Result:=A;
end;

end.
