Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
Delphi 12 Athens
|
AW: Vektorklasse mit echten Operatoren
17. Mär 2014, 14:47
Ich hatte sowas schon mal probeweise für zweidimensionale Vektoren implementiert, das aber später aus Performancegründen nicht weiter verfolgt. Im 3D-Bereich gibt es dann allerdings zwei Arten der Multiplikation zweier Vektoren. Leider geht das Overloading der Operatoren nicht so weit, daß man dort noch nach dem Ergebnistyp unterscheidet. In dem Fall würde das Kreuzprodukt dann wohl aus der Semantik rausfallen.
Delphi-Quellcode:
const
NativeFormat: TFormatSettings = (DecimalSeparator: '.');
type
TVektor = record
X, Y: Extended;
class operator Add(A, B: TVektor): TVektor;
class operator Divide(A: TVektor; B: Extended): TVektor;
class operator Equal(A, B: TVektor): Boolean;
class operator Explicit(A: TVektor): string;
class operator Implicit(A: TVektor): string;
class operator Multiply(A: Extended; B: TVektor): TVektor;
class operator Multiply(A: TVektor; B: Extended): TVektor;
class operator Multiply(A: TVektor; B: TVektor): Extended;
class operator Negative(A: TVektor): TVektor;
class operator NotEqual(A, B: TVektor): Boolean;
class operator Positive(A: TVektor): TVektor;
class operator Subtract(A, B: TVektor): TVektor;
end;
class operator TVektor.Add(A, B: TVektor): TVektor;
begin
result.X := A.X + B.X;
result.Y := A.Y + B.Y;
end;
class operator TVektor.Divide(A: TVektor; B: Extended): TVektor;
begin
result.X := A.X / B;
result.Y := A.Y / B;
end;
class operator TVektor.Equal(A, B: TVektor): Boolean;
begin
result := SameValue(A.X, B.X) and SameValue(A.Y, B.Y);
end;
class operator TVektor.Explicit(A: TVektor): string;
begin
result := Format('(%1.3f, %1.3f)', [A.X, A.Y], NativeFormat);
end;
class operator TVektor.Implicit(A: TVektor): string;
begin
result := string(A);
end;
class operator TVektor.Multiply(A: Extended; B: TVektor): TVektor;
begin
result.X := A * B.X;
result.Y := A * B.Y;
end;
class operator TVektor.Multiply(A: TVektor; B: Extended): TVektor;
begin
result.X := A.X * B;
result.Y := A.Y * B;
end;
class operator TVektor.Multiply(A, B: TVektor): Extended;
begin
result := A.X * B.X + A.Y * B.Y;
end;
class operator TVektor.Negative(A: TVektor): TVektor;
begin
result.X := -A.X;
result.Y := -A.Y;
end;
class operator TVektor.NotEqual(A, B: TVektor): Boolean;
begin
result := not SameValue(A, B);
end;
class operator TVektor.Positive(A: TVektor): TVektor;
begin
result := A;
end;
class operator TVektor.Subtract(A, B: TVektor): TVektor;
begin
result.X := A.X - B.X;
result.Y := A.Y - B.Y;
end;
|
|
Zitat
|