Apophysis-AV/Variations/varSecant.pas
2022-03-08 20:25:51 +03:00

134 lines
3.3 KiB
ObjectPascal

{ Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina }
unit varSecant;
interface
uses
BaseVariation, XFormMan;
type
TVariationSecant = class(TBaseVariation)
private
old: byte;
procedure CalcSecant2;
public
constructor Create;
class function GetName: string; override;
class function GetInstance: TBaseVariation; override;
function GetNrVariables: integer; override;
function GetVariableNameAt(const Index: integer): string; override;
function SetVariable(const Name: string; var value: double): boolean; override;
function GetVariable(const Name: string; var value: double): boolean; override;
procedure CalcFunction; override;
procedure GetCalcFunction(var f: TCalcFunction); override;
end;
implementation
uses
Math;
{ TVariationSecant }
///////////////////////////////////////////////////////////////////////////////
constructor TVariationSecant.Create;
begin
old := 0;
end;
///////////////////////////////////////////////////////////////////////////////
procedure TVariationSecant.GetCalcFunction(var f: TCalcFunction);
begin
if old = 1 then f := CalcFunction
else f := CalcSecant2;
end;
///////////////////////////////////////////////////////////////////////////////
procedure TVariationSecant.CalcFunction;
var
r: double;
begin
r := sqrt(sqr(FTx^) + sqr(FTy^)) * vvar;
r := cos(r);
if (r = 0) then exit;
FPx^ := FPx^ + FTx^ * vvar;
FPy^ := FPy^ + 1 / r;
end;
procedure TVariationSecant.CalcSecant2;
var
r: double;
begin
r := sqrt(sqr(FTx^) + sqr(FTy^)) * vvar;
r := cos(r);
if (r = 0) then exit;
FPx^ := FPx^ + FTx^ * vvar;
if (r < 0) then
FPy^ := FPy^ + (1 / r + 1) * vvar
else
FPy^ := FPy^ + (1 / r - 1) * vvar;
end;
///////////////////////////////////////////////////////////////////////////////
class function TVariationSecant.GetInstance: TBaseVariation;
begin
Result := TVariationSecant.Create;
end;
///////////////////////////////////////////////////////////////////////////////
class function TVariationSecant.GetName: string;
begin
Result := 'secant2';
end;
///////////////////////////////////////////////////////////////////////////////
function TVariationSecant.GetVariableNameAt(const Index: integer): string;
begin
case Index Of
0: Result := 'secant2_old';
else
Result := '';
end;
end;
///////////////////////////////////////////////////////////////////////////////
function TVariationSecant.SetVariable(const Name: string; var value: double): boolean;
begin
Result := False;
if Name = 'secant2_old' then
begin
if Value < 0 then Value := 0;
if Value > 1 then Value := 1;
old := Round(value);
Result := True;
end;
end;
///////////////////////////////////////////////////////////////////////////////
function TVariationSecant.GetNrVariables: integer;
begin
Result := 1;
end;
///////////////////////////////////////////////////////////////////////////////
function TVariationSecant.GetVariable(const Name: string; var value: double): boolean;
begin
Result := False;
if Name = 'secant2_old' then
begin
Value := old;
Result := True;
end;
end;
///////////////////////////////////////////////////////////////////////////////
initialization
RegisterVariation(TVariationClassLoader.Create(TVariationSecant), false, false);
end.