📄 jclcomplex.pas
字号:
end;
try
ImagPart := StrToFloat(Copy(StrToParse, SignPos, Length(StrToParse) - SignPos));
except
raise EJclMathError.CreateRes(@RsComplexInvalidString);
end;
end
else
begin
if (StrToParse[Length(StrToParse)] = 'i') or (StrToParse[Length(StrToParse)] = 'I') then
begin
RealPart := 0.0;
try
ImagPart := StrToFloat(Copy(StrToParse, 1, Length(StrToParse) - 1));
except
raise EJclMathError.CreateRes(@RsComplexInvalidString);
end;
end
else
begin
try
RealPart := StrToFloat(StrToParse);
except
raise EJclMathError.CreateRes(@RsComplexInvalidString);
end;
ImagPart := 0.0;
end;
end;
Assign(RealPart, ImagPart, crRectangular);
end;
procedure TJclComplex.SetPolarString(StrToParse: string);
var
AstPos: Integer;
Radius, Angle: Float;
begin
StrToParse := AnsiUpperCase(StrRemoveChars(StrToParse, [' ']));
AstPos := Pos('*', StrToParse);
if AstPos = 0 then
raise EJclMathError.CreateRes(@RsComplexInvalidString);
try
Radius := StrToFloat(StrLeft(StrToParse, AstPos - 1));
except
raise EJclMathError.CreateRes(@RsComplexInvalidString);
end;
AstPos := Pos('(', StrToParse);
if AstPos = 0 then
raise EJclMathError.CreateRes(@RsComplexInvalidString);
try
Angle := StrToFloat(Copy(StrToParse, AstPos + 1, Length(StrToParse) - AstPos - 1));
except
raise EJclMathError.CreateRes(@RsComplexInvalidString);
end;
Assign(Radius, Angle, crPolar);
end;
function TJclComplex.Duplicate: TJclComplex;
begin
Result := TJclComplex.Create(FCoord.X, FCoord.Y, crRectangular);
Result.FFracLen := FFracLen;
end;
//=== arithmetics ============================================================
function TJclComplex.CoreAdd(const First, Second: TRectCoord): TRectCoord;
begin
Result.X := First.X + Second.X;
Result.Y := First.Y + Second.Y;
end;
function TJclComplex.CAdd(const AddValue: TJclComplex): TJclComplex;
var
ResCoord: TRectCoord;
begin
ResCoord := CoreAdd(RectCoord(Self), RectCoord(AddValue));
FCoord.X := ResCoord.X;
FCoord.Y := ResCoord.Y;
Result := Self;
end;
function TJclComplex.CAdd(const X, Y: Float; const ComplexType: TComplexKind): TJclComplex;
var
NewComplex: TJclComplex;
begin
NewComplex := TJclComplex.Create(X, Y, ComplexType);
try
Result := CAdd(NewComplex);
finally
NewComplex.Free;
end;
end;
function TJclComplex.CNewAdd(const AddValue: TJclComplex): TJclComplex;
var
ResCoord: TRectCoord;
begin
ResCoord := CoreAdd(RectCoord(Self), RectCoord(AddValue));
Result := TJclComplex.Create(ResCoord.X, ResCoord.Y, crRectangular);
Result.FFracLen := FFracLen;
end;
function TJclComplex.CNewAdd(const X, Y: Float; const ComplexType: TComplexKind): TJclComplex;
var
NewComplex: TJclComplex;
begin
NewComplex := TJclComplex.Create(X, Y, ComplexType);
try
Result := CNewAdd(NewComplex);
finally
NewComplex.Free;
end;
end;
function TJclComplex.CoreDiv(const First, Second: TRectCoord): TRectCoord;
var
Denom: Float;
begin
Denom := Sqr(Second.X) + Sqr(Second.Y);
Result.X := (First.X * Second.X + First.Y * Second.Y) / Denom;
Result.Y := (First.Y * Second.X - First.X * Second.Y) / Denom;
end;
function TJclComplex.CDiv(const DivValue: TJclComplex): TJclComplex;
var
ResCoord: TRectCoord;
begin
ResCoord := CoreDiv(RectCoord(Self), RectCoord(DivValue));
FCoord.X := ResCoord.X;
FCoord.Y := ResCoord.Y;
Result := Self;
end;
function TJclComplex.CDiv(const X, Y: Float; const ComplexType: TComplexKind): TJclComplex;
var
NewComplex: TJclComplex;
begin
NewComplex := TJclComplex.Create(X, Y, ComplexType);
try
Result := CDiv(NewComplex);
finally
NewComplex.Free;
end;
end;
function TJclComplex.CNewDiv(const DivValue: TJclComplex): TJclComplex;
var
ResCoord: TRectCoord;
begin
ResCoord := CoreDiv(RectCoord(Self), RectCoord(DivValue));
Result := TJclComplex.Create(ResCoord.X, ResCoord.Y, crRectangular);
Result.FFracLen := FFracLen;
end;
function TJclComplex.CNewDiv(const X, Y: Float; const ComplexType: TComplexKind): TJclComplex;
var
NewComplex: TJclComplex;
begin
NewComplex := TJclComplex.Create(X, Y, ComplexType);
try
Result := CNewDiv(NewComplex);
finally
NewComplex.Free;
end;
end;
function TJclComplex.CoreMul(const First, Second: TRectCoord): TRectCoord;
begin
Result.X := First.X * Second.X - First.Y * Second.Y;
Result.Y := First.X * Second.Y + First.Y * Second.X;
end;
function TJclComplex.CMul(const MulValue: TJclComplex): TJclComplex;
var
ResCoord: TRectCoord;
begin
ResCoord := CoreMul(RectCoord(Self), RectCoord(MulValue));
FCoord.X := ResCoord.X;
FCoord.Y := ResCoord.Y;
Result := Self;
end;
function TJclComplex.CMul(const X, Y: Float; const ComplexType: TComplexKind): TJclComplex;
var
NewComplex: TJclComplex;
begin
NewComplex := TJclComplex.Create(X, Y, ComplexType);
try
Result := CMul(NewComplex);
finally
NewComplex.Free;
end;
end;
function TJclComplex.CNewMul(const MulValue: TJclComplex): TJclComplex;
var
ResCoord: TRectCoord;
begin
ResCoord := CoreMul(RectCoord(Self), RectCoord(MulValue));
Result := TJclComplex.Create(ResCoord.X, ResCoord.Y, crRectangular);
Result.FFracLen := FFracLen;
end;
function TJclComplex.CNewMul(const X, Y: Float; const ComplexType: TComplexKind): TJclComplex;
var
NewComplex: TJclComplex;
begin
NewComplex := TJclComplex.Create(X, Y, ComplexType);
try
Result := CNewMul(NewComplex);
finally
NewComplex.Free;
end;
end;
function TJclComplex.CoreSub(const First, Second: TRectCoord): TRectCoord;
begin
Result.X := First.X - Second.X;
Result.Y := First.Y - Second.Y;
end;
function TJclComplex.CSub(const SubValue: TJclComplex): TJclComplex;
var
ResValue: TRectCoord;
begin
ResValue := CoreSub(RectCoord(Self), RectCoord(SubValue));
FCoord.X := ResValue.X;
FCoord.Y := ResValue.Y;
Result := Self;
end;
function TJclComplex.CSub(const X, Y: Float; const ComplexType: TComplexKind): TJclComplex;
var
NewComplex: TJclComplex;
begin
NewComplex := TJclComplex.Create(X, Y, ComplexType);
try
Result := CSub(NewComplex);
finally
NewComplex.Free;
end;
end;
function TJclComplex.CNewSub(const SubValue: TJclComplex): TJclComplex;
var
ResValue: TRectCoord;
begin
ResValue := CoreSub(RectCoord(Self), RectCoord(SubValue));
Result := TJclComplex.Create(ResValue.X, ResValue.Y, crRectangular);
Result.FFracLen := FFracLen;
end;
function TJclComplex.CNewSub(const X, Y: Float; const ComplexType: TComplexKind): TJclComplex;
var
NewComplex: TJclComplex;
begin
NewComplex := TJclComplex.Create(X, Y, ComplexType);
try
Result := CNewSub(NewComplex);
finally
NewComplex.Free;
end;
end;
function TJclComplex.CNeg;
begin
FCoord.X := -FCoord.X;
FCoord.Y := -FCoord.Y;
Result := Self;
end;
function TJclComplex.CNewNeg;
begin
Result := TJclComplex.Create(-FCoord.X, -FCoord.Y, crRectangular);
Result.FFracLen := FFracLen;
end;
function TJclComplex.CConjugate;
begin
FCoord.Y := -FCoord.Y;
Result := Self;
end;
function TJclComplex.CNewConjugate;
begin
Result := TJclComplex.Create(FCoord.X, -FCoord.Y, crRectangular);
Result.FFracLen := FFracLen;
end;
//=== natural log and exponential functions ==================================
function TJclComplex.CoreLn(const LnValue: TRectCoord): TRectCoord;
begin
Result.X := System.Ln(LnValue.X);
Result.Y := NormalizeAngle(LnValue.Y);
end;
function TJclComplex.CLn: TJclComplex;
var
ResCoord: TRectCoord;
begin
FillCoords(crRectangular);
ResCoord := CoreLn(RectCoord(FCoord.R, FCoord.Theta));
FCoord.X := ResCoord.X;
FCoord.Y := ResCoord.Y;
Result := Self;
end;
function TJclComplex.CNewLn: TJclComplex;
var
ResCoord: TRectCoord;
begin
FillCoords(crRectangular);
ResCoord := CoreLn(RectCoord(FCoord.R, FCoord.Theta));
Result := TJclComplex.Create(ResCoord.X, ResCoord.Y, crRectangular);
Result.FFracLen := FFracLen;
end;
function TJclComplex.CoreExp(const ExpValue: TRectCoord): TRectCoord;
var
ExpX: Float;
begin
ExpX := Exp(ExpValue.X);
Result.X := ExpX * Cos(ExpValue.Y);
Result.Y := ExpX * Sin(ExpValue.Y);
end;
function TJclComplex.CExp: TJclComplex;
var
ResCoord: TRectCoord;
begin
ResCoord := CoreExp(RectCoord(FCoord.X, FCoord.Y));
FCoord.X := ResCoord.X;
FCoord.Y := ResCoord.Y;
Result := Self;
end;
function TJclComplex.CNewExp: TJclComplex;
var
ResCoord: TRectCoord;
begin
ResCoord := CoreExp(RectCoord(FCoord.X, FCoord.Y));
Result := TJclComplex.Create(ResCoord.X, ResCoord.Y, crRectangular);
Result.FFracLen := FFracLen;
end;
function TJclComplex.CorePwr(First, Second, Polar: TRectCoord): TRectCoord;
begin
First.X := MiscalcSingle(First.X);
First.Y := MiscalcSingle(First.Y);
Second.X := MiscalcSingle(Second.X);
Second.Y := MiscalcSingle(Second.Y);
if AbsoluteValueSqr(First) = 0.0 then
if AbsoluteValueSqr(Second) = 0.0 then
Result := RectOne
else
Result := RectZero
else
Result := CoreExp(CoreMul(Second, CoreLn(Polar)));
end;
function TJclComplex.CPwr(const PwrValue: TJclComplex): TJclComplex;
var
ResValue: TRectCoord;
begin
FillCoords(crRectangular);
ResValue := CorePwr(RectCoord(Self), RectCoord(PwrValue), RectCoord(FCoord.R, FCoord.Theta));
FCoord.X := ResValue.X;
FCoord.Y := ResValue.Y;
Result := Self;
end;
function TJclComplex.CPwr(const X, Y: Float; const ComplexType: TComplexKind): TJclComplex;
var
NewComplex: TJclComplex;
begin
NewComplex := TJclComplex.Create(X, Y, ComplexType);
try
Result := CPwr(NewComplex);
finally
NewComplex.Free;
end;
end;
function TJclComplex.CNewPwr(PwrValue: TJclComplex): TJclComplex;
var
ResValue: TRectCoord;
begin
FillCoords(crRectangular);
ResValue := CorePwr(RectCoord(Self), RectCoord(PwrValue), RectCoord(FCoord.R, FCoord.Theta));
Result := TJclComplex.Create(ResValue.X, ResValue.Y, crRectangular);
Result.FFracLen := FFracLen;
end;
function TJclComplex.CNewPwr(const X, Y: Float; const ComplexType: TComplexKind): TJclComplex;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -