Ну для начала в каждую функцию добавить переменную
и в самом начале
Код:
Cell := Grid3D[Trunc(ID)];
что бы не вычислять одно и тоже десять раз. И затем все операции делать с ней, например
Код:
function DsGrid3dCreate(SX,SY,SZ: Double): Double; cdecl;
var
Cell:TGrid3D;
begin
Result:=-1; if SX*SY*SZ>1024*1024*1024 then Exit;
SetLength(Grid3D,Length(Grid3D)+1);
Cell:=TGrid3D.Create;
Grid3D[Grid3DNumber]:=Cell;
Cell.SizeX:=Trunc(SX);
Cell.SizeY:=Trunc(SY);
Cell.SizeZ:=Trunc(SZ);
SetLength(Cell.Grid3D,Cell.SizeX*Cell.SizeY*Cell.SizeZ);
Result:=Grid3DNumber;
Grid3DNumber:=Grid3DNumber+1;
end;
и немного переставить проверки
Код:
function DsGrid3dGet(ID, X, Y, Z: Double): Double; cdecl;
var
r,IX,IY,IZ: Integer;
Cell:TGrid3D;
begin
Result:=-1;
IX := Trunc (X);
if (IX<0) then Exit;
IY := Trunc (Y);
if (IY<0)then Exit;
IZ := Trunc (Z);
if (IZ<0) then Exit;
Cell := Grid3D[Trunc(ID)];
if (IX>=Cell.SizeX) Then Exit;
if (IY>=Cell.SizeY) Then Exit;
if (IZ>=Cell.SizeZ) Then Exit;
r:=Cell.SizeX*Cell.SizeY*IZ+Cell.SizeX*IY+IX;
Result:=Cell.Grid3D[r];
end;