756 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
			
		
		
	
	
			756 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
unit XForm;
 | 
						|
 | 
						|
interface
 | 
						|
 | 
						|
const
 | 
						|
  NVARS = 23;
 | 
						|
  EPS = 1E-10;
 | 
						|
 | 
						|
type
 | 
						|
  TCalcMethod = procedure of object;
 | 
						|
 | 
						|
type
 | 
						|
  TCPpoint = record
 | 
						|
    x, y, c: double;
 | 
						|
  end;
 | 
						|
  PCPpoint = ^TCPpoint;
 | 
						|
 | 
						|
  TXYpoint = record
 | 
						|
    x, y: double;
 | 
						|
  end;
 | 
						|
  PXYpoint = ^TXYpoint;
 | 
						|
 | 
						|
type
 | 
						|
  TXForm = class
 | 
						|
  private
 | 
						|
    FNrFunctions: Integer;
 | 
						|
    FFunctionList: array[0..NVARS] of TCalcMethod;
 | 
						|
 | 
						|
    FTx, FTy: double;
 | 
						|
    FPx, FPy: double;
 | 
						|
    FAngle: double;
 | 
						|
    FSinA: double;
 | 
						|
    FCosA: double;
 | 
						|
    FLength: double;
 | 
						|
    CalculateAngle: boolean;
 | 
						|
    CalculateLength: boolean;
 | 
						|
    CalculateSinCos: boolean;
 | 
						|
 | 
						|
    procedure Linear;              // var[0]
 | 
						|
    procedure Sinusoidal;          // var[1]
 | 
						|
    procedure Spherical;           // var[2]
 | 
						|
    procedure Swirl;               // var[3]
 | 
						|
    procedure Horseshoe;           // var[4]
 | 
						|
    procedure Polar;               // var[5]
 | 
						|
    procedure FoldedHandkerchief;  // var[6]
 | 
						|
    procedure Heart;               // var[7]
 | 
						|
    procedure Disc;                // var[8]
 | 
						|
    procedure Spiral;              // var[9]
 | 
						|
    procedure hyperbolic;          // var[10]
 | 
						|
    procedure Square;              // var[11]
 | 
						|
    procedure Ex;                  // var[12]
 | 
						|
    procedure Julia;               // var[13]
 | 
						|
    procedure Bent;                // var[14]
 | 
						|
    procedure Waves;               // var[15]
 | 
						|
    procedure Fisheye;             // var[16]
 | 
						|
    procedure Popcorn;             // var[17]
 | 
						|
    procedure Exponential;         // var[18]
 | 
						|
    procedure Power;               // var[19]
 | 
						|
    procedure Cosine;              // var[20]
 | 
						|
    procedure Rings;               // var[21]
 | 
						|
    procedure Fan;                 // var[22]
 | 
						|
 | 
						|
 | 
						|
  public
 | 
						|
    vars: array[0..NVARS - 1] of double; // normalized interp coefs between variations
 | 
						|
    c: array[0..2, 0..1] of double;      // the coefs to the affine part of the function
 | 
						|
    density: double;                     // prob is this function is chosen. 0 - 1
 | 
						|
    color: double;                       // color coord for this function. 0 - 1
 | 
						|
    color2: double;                      // Second color coord for this function. 0 - 1
 | 
						|
    symmetry: double;
 | 
						|
    c00, c01, c10, c11, c20, c21: double;
 | 
						|
 | 
						|
    varType: integer;
 | 
						|
 | 
						|
    Orientationtype: integer;
 | 
						|
 | 
						|
    constructor Create;
 | 
						|
    procedure Prepare;
 | 
						|
 | 
						|
    procedure NextPoint(var px, py, pc: double); overload;
 | 
						|
    procedure NextPoint(var CPpoint: TCPpoint); overload;
 | 
						|
    procedure NextPoint(var px, py, pz, pc: double); overload;
 | 
						|
    procedure NextPointXY(var px, py: double);
 | 
						|
    procedure NextPoint2C(var px, py, pc1, pc2: double);
 | 
						|
 | 
						|
  end;
 | 
						|
 | 
						|
implementation
 | 
						|
 | 
						|
uses
 | 
						|
  SysUtils, Math;
 | 
						|
 | 
						|
{ TXForm }
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
constructor TXForm.Create;
 | 
						|
var
 | 
						|
  i: Integer;
 | 
						|
begin
 | 
						|
  density := 0;
 | 
						|
  Color := 0;
 | 
						|
  Vars[0] := 1;
 | 
						|
  for i := 1 to NVARS - 1 do begin
 | 
						|
    Vars[i] := 0;
 | 
						|
  end;
 | 
						|
  c[0, 0] := 1;
 | 
						|
  c[0, 1] := 0;
 | 
						|
  c[1, 0] := 0;
 | 
						|
  c[1, 1] := 1;
 | 
						|
  c[2, 0] := 0;
 | 
						|
  c[2, 1] := 0;
 | 
						|
  Symmetry := 0;
 | 
						|
end;
 | 
						|
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
procedure TXForm.Prepare;
 | 
						|
begin
 | 
						|
  c00 := c[0][0];
 | 
						|
  c01 := c[0][1];
 | 
						|
  c10 := c[1][0];
 | 
						|
  c11 := c[1][1];
 | 
						|
  c20 := c[2][0];
 | 
						|
  c21 := c[2][1];
 | 
						|
 | 
						|
  FNrFunctions := 0;
 | 
						|
 | 
						|
  if (vars[0] <> 0.0) then begin
 | 
						|
    FFunctionList[FNrFunctions] := Linear;
 | 
						|
    Inc(FNrFunctions);
 | 
						|
  end;
 | 
						|
 | 
						|
  if (vars[1] <> 0.0) then begin
 | 
						|
    FFunctionList[FNrFunctions] := Sinusoidal;
 | 
						|
    Inc(FNrFunctions);
 | 
						|
  end;
 | 
						|
 | 
						|
  if (vars[2] <> 0.0) then begin
 | 
						|
    FFunctionList[FNrFunctions] := Spherical;
 | 
						|
    Inc(FNrFunctions);
 | 
						|
  end;
 | 
						|
 | 
						|
  if (vars[3] <> 0.0) then begin
 | 
						|
    FFunctionList[FNrFunctions] := Swirl;
 | 
						|
    Inc(FNrFunctions);
 | 
						|
  end;
 | 
						|
 | 
						|
  if (vars[4] <> 0.0) then begin
 | 
						|
    FFunctionList[FNrFunctions] := Horseshoe;
 | 
						|
    Inc(FNrFunctions);
 | 
						|
  end;
 | 
						|
 | 
						|
  if (vars[5] <> 0.0) then begin
 | 
						|
    FFunctionList[FNrFunctions] := Polar;
 | 
						|
    Inc(FNrFunctions);
 | 
						|
  end;
 | 
						|
 | 
						|
  if (vars[6] <> 0.0) then begin
 | 
						|
    FFunctionList[FNrFunctions] := FoldedHandkerchief;
 | 
						|
    Inc(FNrFunctions);
 | 
						|
  end;
 | 
						|
 | 
						|
  if (vars[7] <> 0.0) then begin
 | 
						|
    FFunctionList[FNrFunctions] := Heart;
 | 
						|
    Inc(FNrFunctions);
 | 
						|
  end;
 | 
						|
 | 
						|
  if (vars[8] <> 0.0) then begin
 | 
						|
    FFunctionList[FNrFunctions] := Disc;
 | 
						|
    Inc(FNrFunctions);
 | 
						|
  end;
 | 
						|
 | 
						|
  if (vars[9] <> 0.0) then begin
 | 
						|
    FFunctionList[FNrFunctions] := Spiral;
 | 
						|
    Inc(FNrFunctions);
 | 
						|
  end;
 | 
						|
 | 
						|
  if (vars[10] <> 0.0) then begin
 | 
						|
    FFunctionList[FNrFunctions] := Hyperbolic;
 | 
						|
    Inc(FNrFunctions);
 | 
						|
  end;
 | 
						|
 | 
						|
  if (vars[11] <> 0.0) then begin
 | 
						|
    FFunctionList[FNrFunctions] := Square;
 | 
						|
    Inc(FNrFunctions);
 | 
						|
  end;
 | 
						|
 | 
						|
  if (vars[12] <> 0.0) then begin
 | 
						|
    FFunctionList[FNrFunctions] := Ex;
 | 
						|
    Inc(FNrFunctions);
 | 
						|
  end;
 | 
						|
 | 
						|
  if (vars[13] <> 0.0) then begin
 | 
						|
    FFunctionList[FNrFunctions] := Julia;
 | 
						|
    Inc(FNrFunctions);
 | 
						|
  end;
 | 
						|
 | 
						|
  if (vars[14] <> 0.0) then begin
 | 
						|
    FFunctionList[FNrFunctions] := Bent;
 | 
						|
    Inc(FNrFunctions);
 | 
						|
  end;
 | 
						|
 | 
						|
  if (vars[15] <> 0.0) then begin
 | 
						|
    FFunctionList[FNrFunctions] := Waves;
 | 
						|
    Inc(FNrFunctions);
 | 
						|
  end;
 | 
						|
 | 
						|
  if (vars[16] <> 0.0) then begin
 | 
						|
    FFunctionList[FNrFunctions] := Fisheye;
 | 
						|
    Inc(FNrFunctions);
 | 
						|
  end;
 | 
						|
 | 
						|
  if (vars[17] <> 0.0) then begin
 | 
						|
    FFunctionList[FNrFunctions] := Popcorn;
 | 
						|
    Inc(FNrFunctions);
 | 
						|
  end;
 | 
						|
 | 
						|
  if (vars[18] <> 0.0) then begin
 | 
						|
    FFunctionList[FNrFunctions] := Exponential;
 | 
						|
    Inc(FNrFunctions);
 | 
						|
  end;
 | 
						|
 | 
						|
  if (vars[19] <> 0.0) then begin
 | 
						|
    FFunctionList[FNrFunctions] := Power;
 | 
						|
    Inc(FNrFunctions);
 | 
						|
  end;
 | 
						|
 | 
						|
  if (vars[20] <> 0.0) then begin
 | 
						|
    FFunctionList[FNrFunctions] := Cosine;
 | 
						|
    Inc(FNrFunctions);
 | 
						|
  end;
 | 
						|
 | 
						|
  if (vars[21] <> 0.0) then begin
 | 
						|
    FFunctionList[FNrFunctions] := Rings;
 | 
						|
    Inc(FNrFunctions);
 | 
						|
  end;
 | 
						|
 | 
						|
  if (vars[22] <> 0.0) then begin
 | 
						|
    FFunctionList[FNrFunctions] := Fan;
 | 
						|
    Inc(FNrFunctions);
 | 
						|
  end;
 | 
						|
 | 
						|
  CalculateAngle := (vars[5] <> 0.0) or (vars[6] <> 0.0) or (vars[7] <> 0.0) or (vars[8] <> 0.0) or
 | 
						|
                    (vars[12] <> 0.0) or (vars[13] <> 0.0) or (vars[21] <> 0.0) or (vars[22] <> 0.0);
 | 
						|
  CalculateLength := False;
 | 
						|
  CalculateSinCos := (vars[4] <> 0.0) or (vars[9] <> 0.0) or (vars[10] <> 0.0) or
 | 
						|
                     (vars[11] <> 0.0) or (vars[16] <> 0.0) or (vars[19] <> 0.0) or
 | 
						|
                     (vars[21] <> 0.0);
 | 
						|
 | 
						|
end;
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
procedure TXForm.Linear;
 | 
						|
begin
 | 
						|
  FPx := FPx + vars[0] * FTx;
 | 
						|
  FPy := FPy + vars[0] * FTy;
 | 
						|
end;
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
procedure TXForm.Sinusoidal;
 | 
						|
begin
 | 
						|
  FPx := FPx + vars[1] * sin(FTx);
 | 
						|
  FPy := FPy + vars[1] * sin(FTy);
 | 
						|
end;
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
procedure TXForm.Spherical;
 | 
						|
var
 | 
						|
  r2: double;
 | 
						|
begin
 | 
						|
  r2 := FTx * FTx + FTy * FTy + 1E-6;
 | 
						|
  FPx := FPx + vars[2] * (FTx / r2);
 | 
						|
  FPy := FPy + vars[2] * (FTy / r2);
 | 
						|
end;
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
procedure TXForm.Swirl;
 | 
						|
var
 | 
						|
  c1, c2, r2: double;
 | 
						|
begin
 | 
						|
  r2 := FTx * FTx + FTy * FTy;
 | 
						|
  c1 := sin(r2);
 | 
						|
  c2 := cos(r2);
 | 
						|
  FPx := FPx + vars[3] * (c1 * FTx - c2 * FTy);
 | 
						|
  FPy := FPy + vars[3] * (c2 * FTx + c1 * FTy);
 | 
						|
end;
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
procedure TXForm.Horseshoe;
 | 
						|
//var
 | 
						|
//  a, c1, c2: double;
 | 
						|
begin
 | 
						|
//  if (FTx < -EPS) or (FTx > EPS) or (FTy < -EPS) or (FTy > EPS) then
 | 
						|
//    a := arctan2(FTx, FTy)
 | 
						|
//  else
 | 
						|
//    a := 0.0;
 | 
						|
//  c1 := sin(FAngle);
 | 
						|
//  c2 := cos(FAngle);
 | 
						|
  FPx := FPx + vars[4] * (FSinA * FTx - FCosA * FTy);
 | 
						|
  FPy := FPy + vars[4] * (FCosA* FTx + FSinA * FTy);
 | 
						|
end;
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
procedure TXForm.Polar;
 | 
						|
var
 | 
						|
  ny: double;
 | 
						|
begin
 | 
						|
  ny := sqrt(FTx * FTx + FTy * FTy) - 1.0;
 | 
						|
  FPx := FPx + vars[5] * (FAngle/PI);
 | 
						|
  FPy := FPy + vars[5] * ny;
 | 
						|
end;
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
procedure TXForm.FoldedHandkerchief;
 | 
						|
var
 | 
						|
  r: double;
 | 
						|
begin
 | 
						|
  r := sqrt(FTx * FTx + FTy * FTy);
 | 
						|
  FPx := FPx + vars[6] * sin(FAngle + r) * r;
 | 
						|
  FPy := FPy + vars[6] * cos(FAngle - r) * r;
 | 
						|
end;
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
procedure TXForm.Heart;
 | 
						|
var
 | 
						|
  r: double;
 | 
						|
begin
 | 
						|
  r := sqrt(FTx * FTx + FTy * FTy);
 | 
						|
 | 
						|
  FPx := FPx + vars[7] * sin(FAngle * r) * r;
 | 
						|
  FPy := FPy + vars[7] * cos(FAngle * r) * -r;
 | 
						|
end;
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
procedure TXForm.Disc;
 | 
						|
var
 | 
						|
  nx, ny, r: double;
 | 
						|
begin
 | 
						|
  nx := FTx * PI;
 | 
						|
  ny := FTy * PI;
 | 
						|
 | 
						|
  r := sqrt(nx * nx + ny * ny);
 | 
						|
  FPx := FPx + vars[8] * sin(r) * FAngle / PI;
 | 
						|
  FPy := FPy + vars[8] * cos(r) * FAngle / PI;
 | 
						|
 | 
						|
end;
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
procedure TXForm.Spiral;
 | 
						|
var
 | 
						|
  r: double;
 | 
						|
begin
 | 
						|
//  r := sqrt(FTx * FTx + FTy * FTy) + 1E-6;
 | 
						|
  r := Flength + 1E-6;
 | 
						|
  FPx := FPx + vars[9] * (FCosA + sin(r)) / r;
 | 
						|
  FPy := FPy + vars[9] * (FsinA - cos(r)) / r;
 | 
						|
end;
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
procedure TXForm.hyperbolic;
 | 
						|
var
 | 
						|
  r: double;
 | 
						|
begin
 | 
						|
//  r := sqrt(FTx * FTx + FTy * FTy) + 1E-6;
 | 
						|
  r := Flength + 1E-6;
 | 
						|
  FPx := FPx + vars[10] * FSinA / r;
 | 
						|
  FPy := FPy + vars[10] * FCosA * r;
 | 
						|
end;
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
procedure TXForm.Square;
 | 
						|
//var
 | 
						|
//  r: double;
 | 
						|
begin
 | 
						|
//  r := sqrt(FTx * FTx + FTy * FTy);
 | 
						|
  FPx := FPx + vars[11] * FSinA * cos(Flength);
 | 
						|
  FPy := FPy + vars[11] * FCosA * sin(Flength);
 | 
						|
end;
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
procedure TXForm.Ex;
 | 
						|
var
 | 
						|
  r: double;
 | 
						|
  n0,n1, m0, m1: double;
 | 
						|
begin
 | 
						|
  r := sqrt(FTx * FTx + FTy * FTy);
 | 
						|
  n0 := sin(FAngle + r);
 | 
						|
  n1 := cos(FAngle - r);
 | 
						|
  m0 := n0 * n0 * n0 * r;
 | 
						|
  m1 := n1 * n1 * n1 * r;
 | 
						|
  FPx := FPx + vars[12] * (m0 + m1);
 | 
						|
  FPy := FPy + vars[12] * (m0 - m1);
 | 
						|
end;
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
procedure TXForm.Julia;
 | 
						|
var
 | 
						|
  a,r: double;
 | 
						|
begin
 | 
						|
  r := Math.power(FTx * FTx + FTy * FTy, 0.25);
 | 
						|
  a := FAngle/2 + Trunc(random * 2) * PI;
 | 
						|
  FPx := FPx + vars[13] * r * cos(a);
 | 
						|
  FPy := FPy + vars[13] * r * sin(a);
 | 
						|
end;
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
procedure TXForm.Bent;
 | 
						|
var
 | 
						|
  nx, ny: double;
 | 
						|
begin
 | 
						|
  nx := FTx;
 | 
						|
  ny := FTy;
 | 
						|
  if (nx < 0) and (nx > -1E100) then
 | 
						|
     nx := nx * 2;
 | 
						|
  if ny < 0 then
 | 
						|
    ny := ny / 2;
 | 
						|
  FPx := FPx + vars[14] * nx;
 | 
						|
  FPy := FPy + vars[14] * ny;
 | 
						|
end;
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
procedure TXForm.Waves;
 | 
						|
var
 | 
						|
  dx,dy,nx,ny: double;
 | 
						|
begin
 | 
						|
  dx := c20;
 | 
						|
  dy := c21;
 | 
						|
  nx := FTx + c10 * sin(FTy / ((dx * dx) + EPS));
 | 
						|
  ny := FTy + c11 * sin(FTx / ((dy * dy) + EPS));
 | 
						|
  FPx := FPx + vars[15] * nx;
 | 
						|
  FPy := FPy + vars[15] * ny;
 | 
						|
end;
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
procedure TXForm.Fisheye;
 | 
						|
var
 | 
						|
 { a,} r: double;
 | 
						|
begin
 | 
						|
//  r := sqrt(FTx * FTx + FTy * FTy);
 | 
						|
//  a := arctan2(FTx, FTy);
 | 
						|
//  r := 2 * r / (r + 1);
 | 
						|
  r := 2 * Flength / (Flength + 1);
 | 
						|
  FPx := FPx + vars[16] * r * FCosA;
 | 
						|
  FPy := FPy + vars[16] * r * FSinA;
 | 
						|
 | 
						|
end;
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
procedure TXForm.Popcorn;
 | 
						|
var
 | 
						|
  dx, dy: double;
 | 
						|
  nx, ny: double;
 | 
						|
begin
 | 
						|
  dx := tan(3 * FTy);
 | 
						|
  if (dx <> dx) then
 | 
						|
    dx := 0.0;                  // < probably won't work in Delphi
 | 
						|
  dy := tan(3 * FTx);            // NAN will raise an exception...
 | 
						|
  if (dy <> dy) then
 | 
						|
    dy := 0.0;                  // remove for speed?
 | 
						|
  nx := FTx + c20 * sin(dx);
 | 
						|
  ny := FTy + c21 * sin(dy);
 | 
						|
  FPx := FPx + vars[17] * nx;
 | 
						|
  FPy := FPy + vars[17] * ny;
 | 
						|
end;
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
procedure TXForm.Exponential;
 | 
						|
var
 | 
						|
  dx, dy: double;
 | 
						|
begin
 | 
						|
  dx := exp(FTx)/ 2.718281828459045;
 | 
						|
  dy := PI * FTy;
 | 
						|
  FPx := FPx + vars[18] * cos(dy) * dx;
 | 
						|
  FPy := FPy + vars[18] * sin(dy) * dx;
 | 
						|
end;
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
procedure TXForm.Power;
 | 
						|
var
 | 
						|
  r: double;
 | 
						|
//  nx, ny: double;
 | 
						|
begin
 | 
						|
//  r := sqrt(FTx * FTx + FTy * FTy);
 | 
						|
//  sa := sin(FAngle);
 | 
						|
  r := Math.Power(FLength, FSinA);
 | 
						|
//  nx := r * FCosA;
 | 
						|
//  ny := r * FSinA;
 | 
						|
  FPx := FPx + vars[19] * r * FCosA;
 | 
						|
  FPy := FPy + vars[19] * r * FSinA;
 | 
						|
end;
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
procedure TXForm.Cosine;
 | 
						|
var
 | 
						|
  nx, ny: double;
 | 
						|
begin
 | 
						|
  nx := cos(FTx * PI) * cosh(FTy);
 | 
						|
  ny := -sin(FTx * PI) * sinh(FTy);
 | 
						|
  FPx := FPx + vars[20] * nx;
 | 
						|
  FPy := FPy + vars[20] * ny;
 | 
						|
end;
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
procedure TXForm.Rings;
 | 
						|
var
 | 
						|
  r: double;
 | 
						|
  dx: double;
 | 
						|
begin
 | 
						|
  dx := sqr(c20) + EPS;
 | 
						|
  r := FLength;
 | 
						|
  r := r + dx - System.Int((r + dx)/(2 * dx)) * 2 * dx - dx + r * (1-dx);
 | 
						|
 | 
						|
  FPx := FPx + vars[21] * r * cos(FAngle);
 | 
						|
  FPy := FPy + vars[21] * r * sin(FAngle);
 | 
						|
end;
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
procedure TXForm.Fan;
 | 
						|
var
 | 
						|
  r,t,a : double;
 | 
						|
  dx, dy, dx2: double;
 | 
						|
begin
 | 
						|
  dy := c21;
 | 
						|
  dx := PI * (sqr(c20) + EPS);
 | 
						|
  dx2 := dx/2;
 | 
						|
 | 
						|
  r := sqrt(FTx * FTx + FTy * FTy);
 | 
						|
 | 
						|
  t := FAngle+dy - System.Int((FAngle + dy)/dx) * dx;
 | 
						|
  if (t > dx2) then
 | 
						|
    a := FAngle - dx2
 | 
						|
  else
 | 
						|
    a := FAngle + dx2;
 | 
						|
 | 
						|
  FPx := FPx + vars[22] * r * cos(a);
 | 
						|
  FPy := FPy + vars[22] * r * sin(a);
 | 
						|
end;
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
procedure TXForm.NextPoint(var px,py,pc: double);
 | 
						|
var
 | 
						|
  i: Integer;
 | 
						|
begin
 | 
						|
  // first compute the color coord
 | 
						|
  pc := (pc + color) * 0.5 * (1 - symmetry) + symmetry * pc;
 | 
						|
 | 
						|
  FTx := c00 * px + c10 * py + c20;
 | 
						|
  FTy := c01 * px + c11 * py + c21;
 | 
						|
 | 
						|
  if CalculateAngle then begin
 | 
						|
    if (FTx < -EPS) or (FTx > EPS) or (FTy < -EPS) or (FTy > EPS) then
 | 
						|
       FAngle := arctan2(FTx, FTy)
 | 
						|
    else
 | 
						|
       FAngle := 0.0;
 | 
						|
  end;
 | 
						|
 | 
						|
  if CalculateSinCos then begin
 | 
						|
    Flength := sqrt(FTx * FTx + FTy * FTy);
 | 
						|
    if FLength = 0 then begin
 | 
						|
      FSinA := 0;
 | 
						|
      FCosA := 0;
 | 
						|
    end else begin
 | 
						|
      FSinA := FTx/FLength;
 | 
						|
      FCosA := FTy/FLength;
 | 
						|
    end;
 | 
						|
  end;
 | 
						|
 | 
						|
//  if CalculateLength then begin
 | 
						|
//    FLength := sqrt(FTx * FTx + FTy * FTy);
 | 
						|
//  end;
 | 
						|
 | 
						|
  Fpx := 0;
 | 
						|
  Fpy := 0;
 | 
						|
 | 
						|
  for i := 0 to FNrFunctions - 1 do
 | 
						|
    FFunctionList[i];
 | 
						|
 | 
						|
  px := FPx;
 | 
						|
  py := FPy;
 | 
						|
end;
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
procedure TXForm.NextPoint(var CPpoint: TCPpoint);
 | 
						|
var
 | 
						|
  i: Integer;
 | 
						|
begin
 | 
						|
  // first compute the color coord
 | 
						|
  CPpoint.c := (CPpoint.c + color) * 0.5 * (1 - symmetry) + symmetry * CPpoint.c;
 | 
						|
 | 
						|
  FTx := c00 * CPpoint.x + c10 * CPpoint.y + c20;
 | 
						|
  FTy := c01 * CPpoint.x + c11 * CPpoint.y + c21;
 | 
						|
 | 
						|
  if CalculateAngle then begin
 | 
						|
    if (FTx < -EPS) or (FTx > EPS) or (FTy < -EPS) or (FTy > EPS) then
 | 
						|
       FAngle := arctan2(FTx, FTy)
 | 
						|
    else
 | 
						|
       FAngle := 0.0;
 | 
						|
  end;
 | 
						|
 | 
						|
  if CalculateSinCos then begin
 | 
						|
    Flength := sqrt(FTx * FTx + FTy * FTy);
 | 
						|
    if FLength = 0 then begin
 | 
						|
      FSinA := 0;
 | 
						|
      FCosA := 1;
 | 
						|
    end else begin
 | 
						|
      FSinA := FTx/FLength;
 | 
						|
      FCosA := FTy/FLength;
 | 
						|
    end;
 | 
						|
  end;
 | 
						|
 | 
						|
//  if CalculateLength then begin
 | 
						|
//    FLength := sqrt(FTx * FTx + FTy * FTy);
 | 
						|
//  end;
 | 
						|
 | 
						|
  Fpx := 0;
 | 
						|
  Fpy := 0;
 | 
						|
 | 
						|
  for i:= 0 to FNrFunctions-1 do
 | 
						|
    FFunctionList[i];
 | 
						|
 | 
						|
  CPpoint.x := FPx;
 | 
						|
  CPpoint.y := FPy;
 | 
						|
end;
 | 
						|
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
procedure TXForm.NextPoint(var px, py, pz, pc: double);
 | 
						|
var
 | 
						|
  i: Integer;
 | 
						|
  tpx, tpy: double;
 | 
						|
begin
 | 
						|
  // first compute the color coord
 | 
						|
  pc := (pc + color) * 0.5 * (1 - symmetry) + symmetry * pc;
 | 
						|
 | 
						|
  case Orientationtype of
 | 
						|
  1:
 | 
						|
     begin
 | 
						|
       tpx := px;
 | 
						|
       tpy := pz;
 | 
						|
     end;
 | 
						|
  2:
 | 
						|
     begin
 | 
						|
       tpx := py;
 | 
						|
       tpy := pz;
 | 
						|
     end;
 | 
						|
  else
 | 
						|
    tpx := px;
 | 
						|
    tpy := py;
 | 
						|
  end;
 | 
						|
 | 
						|
  FTx := c00 * tpx + c10 * tpy + c20;
 | 
						|
  FTy := c01 * tpx + c11 * tpy + c21;
 | 
						|
 | 
						|
  if CalculateAngle then begin
 | 
						|
    if (FTx < -EPS) or (FTx > EPS) or (FTy < -EPS) or (FTy > EPS) then
 | 
						|
       FAngle := arctan2(FTx, FTy)
 | 
						|
    else
 | 
						|
       FAngle := 0.0;
 | 
						|
  end;
 | 
						|
  if CalculateLength then begin
 | 
						|
    FLength := sqrt(FTx * FTx + FTy * FTy);
 | 
						|
  end;
 | 
						|
 | 
						|
  Fpx := 0;
 | 
						|
  Fpy := 0;
 | 
						|
 | 
						|
  for i:= 0 to FNrFunctions-1 do
 | 
						|
    FFunctionList[i];
 | 
						|
 | 
						|
  case Orientationtype of
 | 
						|
  1:
 | 
						|
     begin
 | 
						|
       px := FPx;
 | 
						|
       pz := FPy;
 | 
						|
     end;
 | 
						|
  2:
 | 
						|
     begin
 | 
						|
       py := FPx;
 | 
						|
       pz := FPy;
 | 
						|
     end;
 | 
						|
  else
 | 
						|
    px := FPx;
 | 
						|
    py := FPy;
 | 
						|
  end;
 | 
						|
end;
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
procedure TXForm.NextPoint2C(var px, py, pc1, pc2: double);
 | 
						|
var
 | 
						|
  i: Integer;
 | 
						|
begin
 | 
						|
  // first compute the color coord
 | 
						|
  pc1 := (pc1 + color) * 0.5 * (1 - symmetry) + symmetry * pc1;
 | 
						|
  pc2 := (pc2 + color) * 0.5 * (1 - symmetry) + symmetry * pc2;
 | 
						|
 | 
						|
  FTx := c00 * px + c10 * py + c20;
 | 
						|
  FTy := c01 * px + c11 * py + c21;
 | 
						|
 | 
						|
  if CalculateAngle then begin
 | 
						|
    if (FTx < -EPS) or (FTx > EPS) or (FTy < -EPS) or (FTy > EPS) then
 | 
						|
       FAngle := arctan2(FTx, FTy)
 | 
						|
    else
 | 
						|
       FAngle := 0.0;
 | 
						|
  end;
 | 
						|
//  if CalculateLength then begin
 | 
						|
//    FLength := sqrt(FTx * FTx + FTy * FTy);
 | 
						|
//  end;
 | 
						|
 | 
						|
  Fpx := 0;
 | 
						|
  Fpy := 0;
 | 
						|
 | 
						|
  for i:= 0 to FNrFunctions-1 do
 | 
						|
    FFunctionList[i];
 | 
						|
 | 
						|
  px := FPx;
 | 
						|
  py := FPy;
 | 
						|
end;
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
procedure TXForm.NextPointXY(var px, py: double);
 | 
						|
var
 | 
						|
  i: integer;
 | 
						|
begin
 | 
						|
  FTx := c00 * px + c10 * py + c20;
 | 
						|
  FTy := c01 * px + c11 * py + c21;
 | 
						|
 | 
						|
  if CalculateAngle then begin
 | 
						|
    if (FTx < -EPS) or (FTx > EPS) or (FTy < -EPS) or (FTy > EPS) then
 | 
						|
       FAngle := arctan2(FTx, FTy)
 | 
						|
    else
 | 
						|
       FAngle := 0.0;
 | 
						|
  end;
 | 
						|
 | 
						|
  if CalculateSinCos then begin
 | 
						|
    Flength := sqrt(FTx * FTx + FTy * FTy);
 | 
						|
    if FLength = 0 then begin
 | 
						|
      FSinA := 0;
 | 
						|
      FCosA := 0;
 | 
						|
    end else begin
 | 
						|
      FSinA := FTx/FLength;
 | 
						|
      FCosA := FTy/FLength;
 | 
						|
    end;
 | 
						|
  end;
 | 
						|
 | 
						|
  Fpx := 0;
 | 
						|
  Fpy := 0;
 | 
						|
 | 
						|
  for i:= 0 to FNrFunctions-1 do
 | 
						|
    FFunctionList[i];
 | 
						|
 | 
						|
  px := FPx;
 | 
						|
  py := FPy;
 | 
						|
end;
 | 
						|
 | 
						|
end.
 |