Показать сообщение отдельно
  #4  
Старый 28.01.2013, 17:41
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Ну для начала в каждую функцию добавить переменную
Код:
var
   Cell:TGrid3D;
и в самом начале
Код:
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; 
Ответить с цитированием