Wednesday, November 26, 2014

Returning Function as Array in Delphi

Do you wonder how to do vector operation in Delphi? No, of course, :).

We could go like this.

function tform1.adv(a,b:real):real;
begin
  adv:=a+b;
end;

The problem is the return is real, which is single value only. We want a and b as vector. Wait...

How we define vector in Delphi? I don't know. I used to treat a vector in Delphi as array. So I coded it like this

var a,b:array[0..1]of real;

So far I had no problem. Lately, I am going crazy with overuse functions in Delphi, and trying operating vectors using function too.

But if I write the code like this
function tform1.adv(a,b:array[0..1]of real):real;
begin
  adv:=a[0]+b[0];  
  {a[1]+b[1]?}
end;

It will only return one value. So I improvised by modify it



like this

function tform1.adv(a,b:array[0..1]of real):array[0..1]ofreal;
begin
  adv[0]:=a[0]+b[0];  
  adv[1]:=a[1]+b[1];  
end;

But it won't compile. (it will give error message "identifier expected but ARRAY found"). So I try another approach
type
  vector=array[0..1] of real;

function tform1.adv(a,b:vector):vector;
begin
  adv[0]:=a[0]+b[0];
  adv[1]:=a[1]+b[1];
end;

It works, :).

Here my last night tinkering with "vector" in Delphi, :)

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Math;
type
  vector=array[0..1] of real;

type
  TForm1 = class(TForm)
    procedure proses;
    function mux(a:real;b:vector):vector;
    function dot(a,b:vector):real;
    function norm(a,b:vector):vector;
    function adv(a,b:vector):vector;
    function suv(a,b:vector):vector;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
const
  n=3;
var
  Form1: TForm1;
  r,v:array[1..n] of vector;
implementation

{$R *.dfm}
function tform1.adv(a,b:vector):vector;
begin
  adv[0]:=a[0]+b[0];
  adv[1]:=a[1]+b[1];
end;
function tform1.suv(a,b:vector):vector;
begin
  suv[0]:=a[0]-b[0];
  suv[1]:=a[1]-b[1];
end;
function tform1.mux(a:real;b:vector):vector;
begin
  mux[0]:=a*b[0];
  mux[1]:=a*b[1];
end;

function tform1.dot(a,b:vector):real;
begin
  dot:=a[0]*b[0]+a[1]*b[1];
end;
function tform1.norm(a,b:vector):vector;
var mag,i,j:real;
begin
  i:=b[0]-a[0];
  j:=b[1]-a[1];
  mag:=sqrt(power(i,2)+power(j,2));
  if mag<>0 then begin
    norm[0]:=i/mag;
    norm[1]:=j/mag;
  end;
end;
procedure tform1.proses;
var direction:vector;
vi,vj,swap:real;
i,j:integer;
begin
  j:=2;i:=1;
  direction:=norm(r[j],r[i]);//call function
  vi:=dot(v[i],direction);
  vj:=dot(v[j],direction);
  swap:=vj-vi;
  v[i]:=adv(v[i],mux(swap,direction));
  v[j]:=suv(v[j],mux(swap,direction));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  proses;
end;

end.