diff --git a/2.10/Source/XForm.pas b/2.10/Source/XForm.pas index 027dd79..b4537fb 100644 --- a/2.10/Source/XForm.pas +++ b/2.10/Source/XForm.pas @@ -63,6 +63,7 @@ type procedure Cosine; // var[20] procedure Rings; // var[21] procedure Fan; // var[22] + procedure Triblob; // var[23] procedure Daisy; // var[24] procedure Checkers; // var[25] diff --git a/2.10/Source/XFormMan.pas b/2.10/Source/XFormMan.pas index be503e8..ab7617b 100644 --- a/2.10/Source/XFormMan.pas +++ b/2.10/Source/XFormMan.pas @@ -6,7 +6,7 @@ uses BaseVariation; const - NRLOCVAR = 27; + NRLOCVAR = 23; function NrVar: integer; function Varnames(const index: integer): String; @@ -57,11 +57,7 @@ const 'power', 'cosine', 'rings', - 'fan', - 'triblob', - 'daisy', - 'checkers', - 'crot' + 'fan' ); begin if Index < NRLOCVAR then diff --git a/2.10/Source/varFan2.pas b/2.10/Source/varFan2.pas new file mode 100644 index 0000000..2443c63 --- /dev/null +++ b/2.10/Source/varFan2.pas @@ -0,0 +1,129 @@ +unit varFan2; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationFan2 = class(TBaseVariation) + private + FX,FY: double; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + class function GetNrVariables: integer; override; + class 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; + end; + +implementation + +uses + Math; + +{ TVariationTest } + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationFan2.CalcFunction; +const + EPS = 1E-10; +var + r,t,a : double; + dx, dy, dx2: double; + Angle: double; +begin + r := sqrt(FTx^ * FTx^ + FTy^ * FTy^); + if (FTx^ < -EPS) or (FTx^ > EPS) or (FTy^ < -EPS) or (FTy^ > EPS) then + Angle := arctan2(FTx^, FTy^) + else + Angle := 0.0; + + dy := FY; + dx := PI * (sqr(FX) + EPS); + dx2 := dx/2; + + t := Angle+dy - System.Int((Angle + dy)/dx) * dx; + if (t > dx2) then + a := Angle - dx2 + else + a := Angle + dx2; + + FPx^ := FPx^ + vvar * r * sin(Angle); + FPy^ := FPy^ + vvar * r * cos(Angle); +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationFan2.Create; +begin + FX := 2 * Random - 1; + FY := 2 * Random - 1; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationFan2.GetInstance: TBaseVariation; +begin + Result := TVariationFan2.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationFan2.GetName: string; +begin + Result := 'fan2'; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationFan2.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'fan2_x'; + 1: Result := 'fan2_y'; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationFan2.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'fan2_x' then begin + FX := Value; + Result := True; + end else if Name = 'fan2_y' then begin + FY := Value; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationFan2.GetNrVariables: integer; +begin + Result := 2 +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationFan2.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'fan2_x' then begin + Value := FX; + Result := True; + end else if Name = 'fan2_y' then begin + Value := FY; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationFan2); +end. diff --git a/2.10/Source/varRings2.pas b/2.10/Source/varRings2.pas new file mode 100644 index 0000000..be8dc95 --- /dev/null +++ b/2.10/Source/varRings2.pas @@ -0,0 +1,116 @@ +unit varRings2; + +interface + +uses + BaseVariation, XFormMan; + +type + TVariationRings2 = class(TBaseVariation) + private + FVal: double; + public + constructor Create; + + class function GetName: string; override; + class function GetInstance: TBaseVariation; override; + + class function GetNrVariables: integer; override; + class 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; + end; + +implementation + +uses + Math; + +const + EPS = 1E-10; + + +{ TVariationTest } + +/////////////////////////////////////////////////////////////////////////////// +procedure TVariationRings2.CalcFunction; +var + dx,r: double; + Length: double; + Angle: double; +begin + Length := sqrt(FTx^ * FTx^ + FTy^ * FTy^); + if (FTx^ < -EPS) or (FTx^ > EPS) or (FTy^ < -EPS) or (FTy^ > EPS) then + Angle := arctan2(FTx^, FTy^) + else + Angle := 0.0; + + dx := sqr(FVal) + EPS; + r := Length + dx - System.Int((Length + dx)/(2 * dx)) * 2 * dx - dx + Length * (1-dx); + + FPx^ := FPx^ + vvar * r * sin(Angle); + FPy^ := FPy^ + vvar * r * cos(Angle); +end; + +/////////////////////////////////////////////////////////////////////////////// +constructor TVariationRings2.Create; +begin + FVal := Random * 2; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationRings2.GetInstance: TBaseVariation; +begin + Result := TVariationRings2.Create; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationRings2.GetName: string; +begin + Result := 'rings2'; +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationRings2.GetVariableNameAt(const Index: integer): string; +begin + case Index Of + 0: Result := 'rings2_val'; + else + Result := ''; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationRings2.SetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'rings2_val' then begin + FVal := Value; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +class function TVariationRings2.GetNrVariables: integer; +begin + Result := 1 +end; + +/////////////////////////////////////////////////////////////////////////////// +function TVariationRings2.GetVariable(const Name: string; var value: double): boolean; +begin + Result := False; + if Name = 'rings2_val' then begin + Value := FVal; + Result := True; + end +end; + +/////////////////////////////////////////////////////////////////////////////// +initialization + RegisterVariation(TVariationRings2); +end. diff --git a/2.10/Source/varblob.pas b/2.10/Source/varblob.pas index 9eec9ba..0d81c70 100644 --- a/2.10/Source/varblob.pas +++ b/2.10/Source/varblob.pas @@ -49,8 +49,8 @@ begin r := r * (FLow + (FHigh - FLow) * (0.5 + 0.5 * sin(FWaves * Angle))); - FPx^ := FPx^ + vvar * r * cos(Angle); - FPy^ := FPy^ + vvar * r * sin(Angle); + FPx^ := FPx^ + vvar * r * sin(Angle); + FPy^ := FPy^ + vvar * r * cos(Angle); end; ///////////////////////////////////////////////////////////////////////////////