Einzelnen Beitrag anzeigen

Benutzerbild von vsilverlord
vsilverlord

Registriert seit: 7. Jan 2008
Ort: Baden Württemberg- Hohenlohekreis
174 Beiträge
 
RAD-Studio 2009 Arc
 
#1

mein record Tvektor ist ineffizient

  Alt 11. Nov 2009, 19:51
Guten Tag,
ich hab eine einen packed record erstellt, mit dem ich mithilfe von Class operatoren Vektoren (x,y,z) berechnen kann, zb so: 8)
Delphi-Quellcode:
a,b,c:tvektor;
a := creatvektor(2,20,4);
b := -a/2;
c := a+b;
Das Problem dabei ist, dass dabei unfassbar viel unnötiger Speicher verbraucht wird, da, wenn ich mehrere Vektoren verknüpfe, diese immer ganz kopiert werden! Viel besser wäre das mit Pointer umzusetzen,
dosomething(a,b:pointer):pointer aber dann funktionieren die Class operatoren nicht mehr! Wie schrecklich!
Nun hab ich mir überlegt, einen neuen pointer auf tvektor zu bauen, aber da funktionieren die class operatoren erst recht nicht!
zum besseren Verständnis erst einmal den Quelltext:
Delphi-Quellcode:
unit uvektor;

interface

uses types,math,sysutils;
type
 tvektor3=packed record
 x,y,z:extended;
 //addition
 class operator add(a,b:tvektor3):tvektor3;
 class operator add(a:tvektor3;b:extended):tvektor3;
 class operator add(b:extended;a:tvektor3):tvektor3;
 //subtraktion
 class operator Subtract(a,b:tvektor3):tvektor3;
 class operator Subtract(a:tvektor3;b:extended):tvektor3;
 class operator Subtract(b:extended;a:tvektor3):tvektor3;
 //Multiplikation
 class operator Multiply(a,b:tvektor3):tvektor3;
 class operator Multiply(a:tvektor3;b:extended):tvektor3;
 class operator Multiply(b:extended;a:tvektor3):tvektor3;
 //Division
 class operator Divide(a,b:tvektor3):tvektor3;
 class operator Divide(a:tvektor3;b:extended):tvektor3;
 class operator Divide(b:extended;a:tvektor3):tvektor3;
 //negatives Vorzeichen
 class operator Negative(a:tvektor3):tvektor3;
 // größer als
 class operator GreaterThan(a,b:tvektor3):boolean;
 //kleiner als
 class operator LessThan(a,b:tvektor3):boolean;
end;
pvektor3=^tvektor3;

function createvektor(x,y,z:extended):tvektor3;
function skalarbetrag(a:tvektor3):extended;
function entfernung(a,b:tvektor3):extended;//ab
function vektortostr(a:tvektor3):string;

implementation
   //addition
   class operator tvektor3.add(a,b:tvektor3):tvektor3;
   begin
   result.x:=a.x+b.x;
   result.y:=a.y+b.y;
   result.z:=a.z+b.z;
   end;
   class operator tvektor3.add(a:tvektor3;b:extended):tvektor3;
   begin
   result.x:=a.x+b;
   result.y:=a.y+b;
   result.z:=a.z+b;
   end;
   class operator tvektor3.add(b:extended;a:tvektor3):tvektor3;
   begin
   result.x:=a.x+b;
   result.y:=a.y+b;
   result.z:=a.z+b;
   end;
   //subtraktion
   class operator tvektor3.subtract(a,b:tvektor3):tvektor3;
   begin
   result.x:= a.x-b.x;
   result.y:= a.y-b.y;
   result.z:= a.z-b.z;
   end;
   class operator tvektor3.subtract(a:tvektor3;b:extended):tvektor3;
   begin
   result.x:= a.x-b;
   result.y:= a.y-b;
   result.z:= a.z-b;
   end;
   class operator tvektor3.subtract(b:extended;a:tvektor3):tvektor3;
   begin
   result.x:= b-a.x;
   result.y:= b-a.y;
   result.z:= b-a.z;
   end;
   // multiplikation
   class operator tvektor3.Multiply(a,b:tvektor3):tvektor3;
   begin
   result.x:=a.x*b.x;
   result.y:=a.y*b.y;
   result.z:=a.z*b.z;
   end;
   class operator tvektor3.Multiply(a:tvektor3;b:extended):tvektor3;
   begin
   result.x:=a.x*b;
   result.y:=a.y*b;
   result.z:=a.z*b;
   end;
   class operator tvektor3.Multiply(b:extended;a:tvektor3):tvektor3;
   begin
   result.x:=a.x*b;
   result.y:=a.y*b;
   result.z:=a.z*b;
   end;
   //Division
   class operator tvektor3.Divide(a,b:tvektor3):tvektor3;
   begin
   result.x:=a.x/b.x;
   result.y:=a.y/b.y;
   result.z:=a.z/b.z;
   end;
   class operator tvektor3.Divide(a:tvektor3;b:extended):tvektor3;
   begin
   result.x:=a.x/b;
   result.y:=a.y/b;
   result.z:=a.z/b;
   end;
   class operator tvektor3.Divide(b:extended;a:tvektor3):tvektor3;
   begin
   result.x:=b/a.x;
   result.y:=b/a.y;
   result.z:=b/a.z;
   end;
   //Negatives Vorzeichen
   class operator tvektor3.Negative(a:tvektor3):tvektor3;
   begin
   a.x:=-a.x;
   a.y:=-a.y;
   a.z:=-a.z;
   end;
   // größer als
   class operator tvektor3.greaterthan(a,b:tvektor3):boolean;
   begin
   result:=false;
   if (a.x>b.x)or(a.y>b.y)or(a.z>b.z) then
   result:=true;
   end;
   //kleiner als
   class operator tvektor3.LessThan(a,b:tvektor3):boolean;
   begin
   result:=false;
   if (a.x<b.x)or(a.y<b.y)or(a.z<b.z) then
   result:=true;
   end;
   //standart funktionen
  function entfernung(a,b:tvektor3): extended;
  begin
    result:=skalarbetrag(a-b);
  end;

  function createvektor(x,y,z:extended):tvektor3;
  begin
    result.X:=x;
    result.Y:=y;
    result.z:=Z;
  end;
  function skalarbetrag(a:tvektor3):extended;
  begin
   result:=sqrt(power(a.x,2)+power(a.y,2)+power(a.z,2));
  end;

  function vektortostr(a:tvektor3):string;
  begin
   result:=floattostr(a.x)+'/'+floattostr(a.y)+'/'+floattostr(a.z)
  end;

end.
Meine Frage ist jetzt, wie ich diesen Quelltext optimieren kann, sodass Pointer und Class operatoren verwendet werden können!
Volker
~beware
Wizards First Rule:
People are stupid; given proper motivation, almost anyone will believe almost anything. Because people are stupid, they will believe a lie because they want to believe it’s true, or because they are afraid it might be true
  Mit Zitat antworten Zitat