95a2f54683
git-svn-id: https://svn.code.sf.net/p/apophysis7x/svn/trunk@1 a5d1c0f9-a0e9-45c6-87dd-9d276e40c949
160 lines
4.2 KiB
ObjectPascal
160 lines
4.2 KiB
ObjectPascal
unit varEpispiral; // <-- JK Changed unit name to avoid clobbering original
|
|
//by Joel Faber (adapted for plugin example by Jed Kelsey (JK)
|
|
interface
|
|
|
|
uses
|
|
BaseVariation, XFormMan; // <-- JK Removed some (unnecessary?) units
|
|
|
|
const
|
|
EPS: double = 1E-6;
|
|
type
|
|
TVariationEpispiral = class(TBaseVariation)
|
|
private
|
|
n, thickness, holes : double;
|
|
|
|
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;
|
|
function ResetVariable(const Name: string): boolean; override;
|
|
|
|
procedure Prepare; override;
|
|
procedure CalcFunction; override;
|
|
end;
|
|
|
|
implementation
|
|
|
|
uses
|
|
Math;
|
|
|
|
// TVariationEpispiral
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
constructor TVariationEpispiral.Create;
|
|
begin
|
|
n := 6.0;
|
|
thickness := 0.0;
|
|
holes := 1.0;
|
|
end;
|
|
|
|
procedure TVariationEpispiral.Prepare;
|
|
begin //calculate constants
|
|
// nothing for now
|
|
end;
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
procedure TVariationEpispiral.CalcFunction;
|
|
var
|
|
t, theta : double;
|
|
begin
|
|
theta := arctan2(FTy^, FTx^);
|
|
|
|
t := (random*thickness)*(1/cos(n*theta)) - holes;
|
|
|
|
|
|
if (abs(t) = 0) then
|
|
begin
|
|
FPx^ := FPx^;
|
|
FPy^ := FPy^;
|
|
end
|
|
else
|
|
begin
|
|
FPx^ := FPx^ + vvar*t*cos(theta);
|
|
FPy^ := FPy^ + vvar*t*sin(theta);
|
|
end;
|
|
end;
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
class function TVariationEpispiral.GetInstance: TBaseVariation;
|
|
begin
|
|
Result := TVariationEpispiral.Create;
|
|
end;
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
class function TVariationEpispiral.GetName: string;
|
|
begin
|
|
Result := 'epispiral';
|
|
end;
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
function TVariationEpispiral.GetVariableNameAt(const Index: integer): string;
|
|
begin
|
|
case Index Of
|
|
0: Result := 'epispiral_n';
|
|
1: Result := 'epispiral_thickness';
|
|
2: Result := 'epispiral_holes';
|
|
else
|
|
Result := '';
|
|
end
|
|
end;
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
function TVariationEpispiral.SetVariable(const Name: string; var value: double): boolean;
|
|
begin
|
|
Result := False;
|
|
if Name = 'epispiral_n' then begin
|
|
n := Value;
|
|
Result := True;
|
|
end else if Name = 'epispiral_thickness' then begin
|
|
thickness := Value;
|
|
Result := True;
|
|
end
|
|
else if Name = 'epispiral_holes' then begin
|
|
holes := Value;
|
|
Result := True;
|
|
end
|
|
end;
|
|
|
|
function TVariationEpispiral.ResetVariable(const Name: string): boolean;
|
|
begin
|
|
Result := False;
|
|
if Name = 'epispiral_n' then begin
|
|
n := 6.0;
|
|
Result := True;
|
|
end else if Name = 'epispiral_thickness' then begin
|
|
thickness := 0.0;
|
|
Result := True;
|
|
end
|
|
else if Name = 'epispiral_holes' then begin
|
|
holes := 0.0;
|
|
Result := True;
|
|
end
|
|
end;
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
function TVariationEpispiral.GetNrVariables: integer;
|
|
begin
|
|
Result := 3;
|
|
end;
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
function TVariationEpispiral.GetVariable(const Name: string; var value: double): boolean;
|
|
begin
|
|
Result := False;
|
|
if Name = 'epispiral_n' then begin
|
|
Value := n;
|
|
Result := True;
|
|
end else if Name = 'epispiral_thickness' then begin
|
|
Value := thickness;
|
|
Result := True;
|
|
end
|
|
else if Name = 'epispiral_holes' then begin
|
|
Value := holes;
|
|
Result := True;
|
|
end
|
|
end;
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
initialization
|
|
RegisterVariation(TVariationClassLoader.Create(TVariationEpispiral), true, false); // <-- JK Plugin manager does this
|
|
end.
|
|
|