added several CalcFunctions for varJuliaN

This commit is contained in:
zueuk 2006-03-18 17:57:33 +00:00
parent 85bc00513e
commit a9aeab94ad
2 changed files with 201 additions and 3 deletions

View File

@ -1,6 +1,10 @@
unit BaseVariation; unit BaseVariation;
interface interface
type
TCalcFunction = procedure of object;
type type
TBaseVariation = class TBaseVariation = class
protected protected
@ -22,6 +26,7 @@ type
procedure Prepare; virtual; procedure Prepare; virtual;
procedure CalcFunction; virtual; abstract; procedure CalcFunction; virtual; abstract;
procedure GetCalcFunction(var Delphi_Suxx: TCalcFunction); virtual;
end; end;
TBaseVariationClass = class of TBaseVariation; TBaseVariationClass = class of TBaseVariation;
@ -61,4 +66,9 @@ begin
end; end;
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
procedure TBaseVariation.GetCalcFunction(var Delphi_Suxx: TCalcFunction);
begin
Delphi_Suxx := CalcFunction;
end;
end. end.

View File

@ -7,7 +7,9 @@ uses
const const
var_n_name='julian_power'; var_n_name='julian_power';
var_c_name='julian_c'; var_c_name='julian_dist';
{$define _ASM_}
type type
TVariationJulian = class(TBaseVariation) TVariationJulian = class(TBaseVariation)
@ -17,6 +19,11 @@ type
cn: double; cn: double;
procedure CalcPower1;
procedure CalcPowerMinus1;
procedure CalcPower2;
procedure CalcPowerMinus2;
public public
constructor Create; constructor Create;
@ -31,6 +38,7 @@ type
procedure Prepare; override; procedure Prepare; override;
procedure CalcFunction; override; procedure CalcFunction; override;
procedure GetCalcFunction(var f: TCalcFunction); override;
end; end;
implementation implementation
@ -52,8 +60,19 @@ begin
cn := c / N / 2; cn := c / N / 2;
end; end;
///////////////////////////////////////////////////////////////////////////////
procedure TVariationJulian.GetCalcFunction(var f: TCalcFunction);
begin
if cn = 1/4 then f := CalcPower2
else if cn = -1/4 then f := CalcPowerMinus2
else if cn = 1/2 then f := CalcPower1
else if cn = -1/2 then f := CalcPowerMinus1
else f := CalcFunction;
end;
///////////////////////////////////////////////////////////////////////////////
procedure TVariationJulian.CalcFunction; procedure TVariationJulian.CalcFunction;
{$if false} {$ifndef _ASM_}
var var
r: double; r: double;
sina, cosa: extended; sina, cosa: extended;
@ -115,7 +134,176 @@ asm
fadd qword ptr [edx] fadd qword ptr [edx]
fstp qword ptr [edx] fstp qword ptr [edx]
fwait fwait
{$ifend} {$endif}
end;
procedure TVariationJulian.CalcPower2;
{$ifndef _ASM_}
var
r: double;
sina, cosa: extended;
begin
sincos((arctan2(FTy^, FTx^)/2 + pi*random(2)), sina, cosa);
r := vvar * sqrt(sqrt(sqr(FTx^) + sqr(FTy^)));
FPx^ := FPx^ + r * cosa;
FPy^ := FPy^ + r * sina;
{$else}
asm
mov edx, [eax + FTy]
fld qword ptr [edx]
mov edx, [eax + FTx]
fld qword ptr [edx]
fld st(1)
fld st(1)
fpatan
fld1
fadd st, st
fdivp st(1), st
mov ecx, eax
mov eax, 2
call System.@RandInt
fldpi
push eax
fimul dword ptr [esp]
add esp, 4
faddp
fxch st(2)
fmul st, st
fxch st(1)
fmul st, st
faddp
fsqrt
fsqrt
fmul qword ptr [ecx + vvar]
fxch st(1)
fsincos
fmul st, st(2)
mov edx, [ecx + FPx]
fadd qword ptr [edx]
fstp qword ptr [edx]
fmulp
mov edx, [ecx + FPy]
fadd qword ptr [edx]
fstp qword ptr [edx]
fwait
{$endif}
end;
procedure TVariationJulian.CalcPowerMinus2;
{$ifndef _ASM_}
var
r: double;
sina, cosa: extended;
begin
sincos((arctan2(FTy^, FTx^)/2 + pi*random(2)), sina, cosa);
r := vvar / sqrt(sqrt(sqr(FTx^) + sqr(FTy^)));
FPx^ := FPx^ + r * cosa;
FPy^ := FPy^ - r * sina;
{$else}
asm
mov edx, [eax + FTy]
fld qword ptr [edx]
mov edx, [eax + FTx]
fld qword ptr [edx]
fld st(1)
fld st(1)
fpatan
fld1
fadd st, st
fdivp st(1), st
mov ecx, eax
mov eax, 2
call System.@RandInt
fldpi
push eax
fimul dword ptr [esp]
add esp, 4
faddp
fxch st(2)
fmul st, st
fxch st(1)
fmul st, st
faddp
fsqrt
fsqrt
fdivr qword ptr [ecx + vvar]
fxch st(1)
fsincos
fmul st, st(2)
mov edx, [ecx + FPx]
fadd qword ptr [edx]
fstp qword ptr [edx]
fmulp
mov edx, [ecx + FPy]
fsubr qword ptr [edx]
fstp qword ptr [edx]
fwait
{$endif}
end;
procedure TVariationJulian.CalcPower1;
{$ifndef _ASM_}
begin
FPx^ := FPx^ + vvar * FTx^;
FPy^ := FPy^ + vvar * FTy^;
{$else}
asm
mov edx, [eax + FTy]
fld qword ptr [edx]
mov edx, [eax + FTx]
fld qword ptr [edx]
fld qword ptr [eax + vvar]
fmul st(2), st
fmulp
mov edx, [eax + FPx]
fadd qword ptr [edx]
fstp qword ptr [edx]
mov edx, [eax + FPy]
fadd qword ptr [edx]
fstp qword ptr [edx]
fwait
{$endif}
end;
procedure TVariationJulian.CalcPowerMinus1;
{$ifndef _ASM_}
var
r: double;
begin
r := vvar / (sqr(FTx^) + sqr(FTy^));
FPx^ := FPx^ + r * FTx^;
FPy^ := FPy^ - r * FTy^;
{$else}
asm
mov edx, [eax + FTy]
fld qword ptr [edx]
mov edx, [eax + FTx]
fld qword ptr [edx]
fld st(1)
fmul st, st
fld st(1)
fmul st, st
faddp
fdivr qword ptr [eax + vvar]
fmul st(2), st
fmulp
mov edx, [eax + FPx]
fadd qword ptr [edx]
fstp qword ptr [edx]
mov edx, [eax + FPy]
fsubr qword ptr [edx]
fstp qword ptr [edx]
fwait
{$endif}
end; end;
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////