Moved the making of random flames to a seperate unit

Number of variant dependant code change so all changes can be done only in xform
Test mode for new variant added
This commit is contained in:
ronaldhordijk 2005-04-02 10:53:22 +00:00
parent 265d667f49
commit 6b8c455c52
12 changed files with 296 additions and 556 deletions

View File

@ -21,7 +21,7 @@ unit ControlPoint;
interface interface
uses uses
Classes, jpeg, ComCtrls, Windows, Graphics, Cmap, Dialogs, Xform; Classes, Windows, Cmap, Xform;
const const
EPS = 1E-10; EPS = 1E-10;
@ -39,8 +39,8 @@ type
vHandkerchief, vHeart, vDisc, vSpiral, vHyperbolic, vSquare, vEx, vJulia, vHandkerchief, vHeart, vDisc, vSpiral, vHyperbolic, vSquare, vEx, vJulia,
vBent, vWaves, vFisheye, vPopcorn, vExponential, vPower, vCosine, vBent, vWaves, vFisheye, vPopcorn, vExponential, vPower, vCosine,
vRings, vFan, vRandom); vRings, vFan, vRandom);
type
type
TPointsArray = array of TCPpoint; TPointsArray = array of TCPpoint;
TPointsXYArray = array of TXYpoint; TPointsXYArray = array of TXYpoint;
@ -84,7 +84,6 @@ type
wiggle: array[0..1, 0..1] of double; // frequency is /minute, assuming 30 frames/s */ wiggle: array[0..1, 0..1] of double; // frequency is /minute, assuming 30 frames/s */
PropTable: array of Integer; PropTable: array of Integer;
jpeg: TJPegImage;
FAngle: Double; FAngle: Double;
FTwoColorDimensions: Boolean; FTwoColorDimensions: Boolean;
private private
@ -111,6 +110,8 @@ type
procedure IterateXYC(NrPoints: integer; var Points: TPointsArray); procedure IterateXYC(NrPoints: integer; var Points: TPointsArray);
procedure IterateXYCC(NrPoints: integer; var Points: T2CPointsArray); procedure IterateXYCC(NrPoints: integer; var Points: T2CPointsArray);
procedure Testiterate(NrPoints: integer; var Points: TPointsArray);
function Clone: TControlPoint; function Clone: TControlPoint;
procedure Copy(cp1: TControlPoint); procedure Copy(cp1: TControlPoint);
@ -127,12 +128,18 @@ type
function add_symmetry_to_control_point(var cp: TControlPoint; sym: integer): integer; function add_symmetry_to_control_point(var cp: TControlPoint; sym: integer): integer;
function CalcUPRMagn(const cp: TControlPoint): double; function CalcUPRMagn(const cp: TControlPoint): double;
implementation implementation
uses uses
SysUtils, math, global; SysUtils, math, global;
var
var_distrib: array[0..NVARS + 18] of integer;
mixed_var_distrib: array[0..NVARS + 8] of integer;
{ TControlPoint } { TControlPoint }
function sign(n: double): double; function sign(n: double): double;
@ -194,9 +201,8 @@ destructor TControlPoint.Destroy;
var var
i: Integer; i: Integer;
begin begin
for i := 0 to NXFORMS - 1 do begin for i := 0 to NXFORMS - 1 do
xform[i].Free; xform[i].Free;
end;
inherited; inherited;
end; end;
@ -525,6 +531,53 @@ begin
end; end;
end; end;
///////////////////////////////////////////////////////////////////////////////
procedure TControlPoint.Testiterate(NrPoints: integer; var Points: TPointsArray);
var
i: Integer;
px, py, pc, pt: double;
CurrentPoint: PCPPoint;
begin
PreparePropTable;
for i := 0 to NXFORMS - 1 do
xform[i].prepare;
for i := 0 to NrPoints - 1 do begin
px := 4 * (-1 + 2 * random);
py := 4 * (-1 + 2 * random);
pc := 0.1 + 0.5 * sqrt(sqr(px/4)+ sqr(py/4)) ;
if abs(px)< 0.02 then
pc := 1 ;
if abs(py)< 0.02 then
pc := 1 ;
if abs(frac(px))< 0.01 then
pc := 1 ;
if abs(frac(py))< 0.01 then
pc := 1 ;
if abs(sqrt(sqr(px/4)+ sqr(py/4)) - 0.9) < 0.02 then
pc := 0;
try
xform[PropTable[Random(1024)]].NextPoint(px,py,pt);
except
on EMathError do begin
exit;
end;
end;
// store points
if i >= 0 then begin
CurrentPoint := @Points[i];
CurrentPoint.X := px;
CurrentPoint.Y := py;
CurrentPoint.C := pc;
end
end;
end;
procedure TControlPoint.IterateXYCC(NrPoints: integer; var Points: T2CPointsArray); procedure TControlPoint.IterateXYCC(NrPoints: integer; var Points: T2CPointsArray);
var var
i: Integer; i: Integer;
@ -799,10 +852,6 @@ end;
procedure TControlPoint.SetVariation(vari: TVariation); procedure TControlPoint.SetVariation(vari: TVariation);
const
xform_distrib: array[0..12] of integer = (2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 7, 8);
var_distrib: array[0..41] of integer = (-1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22);
mixed_var_distrib: array[0..31] of integer = (0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22);
var var
i, j, v: integer; i, j, v: integer;
rv: integer; rv: integer;
@ -834,10 +883,6 @@ begin
end; end;
procedure TControlPoint.RandomCP(min: integer = 2; max: integer = NXFORMS; calc: boolean = true); procedure TControlPoint.RandomCP(min: integer = 2; max: integer = NXFORMS; calc: boolean = true);
const
xform_distrib: array[0..12] of integer = (2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 7, 8);
var_distrib: array[0..41] of integer = (-1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22);
mixed_var_distrib: array[0..31] of integer = (0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22);
var var
nrXforms: integer; nrXforms: integer;
i, j: integer; i, j: integer;
@ -916,6 +961,13 @@ var
cntminy, cntmaxy: integer; cntminy, cntmaxy: integer;
LimitOutSidePoints: integer; LimitOutSidePoints: integer;
begin begin
{$IFDEF TESTVARIANT}
center[0] := 0;
center[1] := 0;
pixels_per_unit := 0.7 * Min(width / (6), Height / (6));
Exit;
{$ENDIF}
// RandSeed := 1234567; // RandSeed := 1234567;
try try
SetLength(Points, SUB_BATCH_SIZE); SetLength(Points, SUB_BATCH_SIZE);
@ -1611,5 +1663,28 @@ begin
end; end;
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
procedure FillVarDisturb;
const
startvar_distrib: array[0..26] of integer = (-1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7);
startmixed_var_distrib: array[0..16] of integer = (0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7);
var
i: integer;
begin
for i := 0 to High(startvar_distrib) do
var_distrib[i] := startvar_distrib[i];
for i := High(startvar_distrib) + 1 to high(var_distrib) do
var_distrib[i] := 8 + i - High(startvar_distrib) - 1;
for i := 0 to High(startmixed_var_distrib) do
mixed_var_distrib[i] := startmixed_var_distrib[i];
for i := High(startmixed_var_distrib) + 1 to high(mixed_var_distrib) do
mixed_var_distrib[i] := 8 + i - High(startmixed_var_distrib) - 1;
end;
///////////////////////////////////////////////////////////////////////////////
initialization
FillVarDisturb
end. end.

View File

@ -41,7 +41,6 @@ object EditForm: TEditForm
0000800100008001000080010000800100008001000080010000FFFF0000} 0000800100008001000080010000800100008001000080010000FFFF0000}
KeyPreview = True KeyPreview = True
OldCreateOrder = True OldCreateOrder = True
Position = poDefaultPosOnly
OnClose = FormClose OnClose = FormClose
OnCreate = FormCreate OnCreate = FormCreate
OnDestroy = FormDestroy OnDestroy = FormDestroy
@ -86,7 +85,6 @@ object EditForm: TEditForm
item item
Width = 150 Width = 150
end> end>
SimplePanel = False
end end
object ControlPanel: TPanel object ControlPanel: TPanel
Left = 394 Left = 394
@ -138,7 +136,7 @@ object EditForm: TEditForm
Width = 57 Width = 57
Height = 21 Height = 21
Style = csDropDownList Style = csDropDownList
ItemHeight = 13 ItemHeight = 0
TabOrder = 1 TabOrder = 1
OnChange = cbTransformsChange OnChange = cbTransformsChange
end end
@ -150,7 +148,6 @@ object EditForm: TEditForm
ActivePage = TabSheet2 ActivePage = TabSheet2
Anchors = [akLeft, akTop, akRight, akBottom] Anchors = [akLeft, akTop, akRight, akBottom]
MultiLine = True MultiLine = True
TabIndex = 3
TabOrder = 2 TabOrder = 2
TabStop = False TabStop = False
object TabSheet1: TTabSheet object TabSheet1: TTabSheet

View File

@ -213,7 +213,8 @@ procedure ScaleAll;
implementation implementation
uses Main, Global, Adjust, Mutate; uses
Main, Global, Adjust, Mutate, Xform;
const const
SUB_BATCH_SIZE = 1000; SUB_BATCH_SIZE = 1000;

View File

@ -129,9 +129,9 @@ var
DefaultPalette: TColorMap; DefaultPalette: TColorMap;
implementation function Round6(x: double): double;
uses dialogs, Main; implementation
{ IFS } { IFS }
@ -140,6 +140,13 @@ begin
Result := (a * d - b * c); Result := (a * d - b * c);
end; end;
function Round6(x: double): double;
// Really ugly, but it works
begin
Result := StrToFloat(Format('%.6f', [x]));
end;
function solve3(x1, x2, x1h, y1, y2, y1h, z1, z2, z1h: double; function solve3(x1, x2, x1h, y1, y2, y1h, z1, z2, z1h: double;
var a, b, e: double): double; var a, b, e: double): double;
var var

View File

@ -2,7 +2,7 @@ object MainForm: TMainForm
Left = 316 Left = 316
Top = 424 Top = 424
Width = 574 Width = 574
Height = 535 Height = 575
Caption = 'Apophysis' Caption = 'Apophysis'
Color = clBtnFace Color = clBtnFace
Font.Charset = ANSI_CHARSET Font.Charset = ANSI_CHARSET
@ -27,7 +27,7 @@ object MainForm: TMainForm
Left = 160 Left = 160
Top = 28 Top = 28
Width = 4 Width = 4
Height = 454 Height = 494
end end
object ToolBar: TToolBar object ToolBar: TToolBar
Left = 0 Left = 0
@ -251,7 +251,7 @@ object MainForm: TMainForm
Left = 0 Left = 0
Top = 28 Top = 28
Width = 160 Width = 160
Height = 454 Height = 494
Align = alLeft Align = alLeft
Columns = < Columns = <
item item
@ -270,7 +270,7 @@ object MainForm: TMainForm
Left = 164 Left = 164
Top = 28 Top = 28
Width = 402 Width = 402
Height = 454 Height = 494
Align = alClient Align = alClient
BevelInner = bvLowered BevelInner = bvLowered
BevelOuter = bvNone BevelOuter = bvNone
@ -281,7 +281,7 @@ object MainForm: TMainForm
Left = 1 Left = 1
Top = 1 Top = 1
Width = 400 Width = 400
Height = 432 Height = 472
Align = alClient Align = alClient
AutoSize = True AutoSize = True
PopupMenu = DisplayPopup PopupMenu = DisplayPopup
@ -293,7 +293,7 @@ object MainForm: TMainForm
end end
object StatusBar: TStatusBar object StatusBar: TStatusBar
Left = 0 Left = 0
Top = 482 Top = 522
Width = 566 Width = 566
Height = 19 Height = 19
Panels = < Panels = <
@ -2706,148 +2706,6 @@ object MainForm: TMainForm
Caption = '-' Caption = '-'
GroupIndex = 1 GroupIndex = 1
end end
object mnuVLinear: TMenuItem
Caption = 'Linear'
GroupIndex = 1
RadioItem = True
OnClick = mnuVLinearClick
end
object mnuSinusoidal: TMenuItem
AutoLineReduction = maManual
Caption = 'Sinusoidal'
GroupIndex = 1
RadioItem = True
OnClick = mnuSinusoidalClick
end
object mnuSpherical: TMenuItem
Caption = 'Spherical'
GroupIndex = 1
RadioItem = True
OnClick = mnuSphericalClick
end
object mnuSwirl: TMenuItem
Caption = 'Swirl'
GroupIndex = 1
RadioItem = True
OnClick = mnuSwirlClick
end
object mnuHorseshoe: TMenuItem
Caption = 'Horseshoe'
GroupIndex = 1
RadioItem = True
OnClick = mnuHorseshoeClick
end
object mnuPolar: TMenuItem
Caption = 'Polar'
GroupIndex = 1
RadioItem = True
OnClick = mnuPolarClick
end
object mnuVar14: TMenuItem
Caption = 'Bent'
GroupIndex = 1
RadioItem = True
OnClick = mnuVar14Click
end
object N17: TMenuItem
Caption = '-'
GroupIndex = 1
end
object mnuVar6: TMenuItem
Caption = 'Handkerchief'
GroupIndex = 1
RadioItem = True
OnClick = mnuVar6Click
end
object mnuVar7: TMenuItem
Caption = 'Heart'
GroupIndex = 1
RadioItem = True
OnClick = mnuVar7Click
end
object mnuVar8: TMenuItem
Caption = 'Disc'
GroupIndex = 1
RadioItem = True
OnClick = mnuVar8Click
end
object mnuVar9: TMenuItem
Caption = 'Spiral'
GroupIndex = 1
RadioItem = True
OnClick = mnuVar9Click
end
object mnuVar10: TMenuItem
Caption = 'Hyperbolic'
GroupIndex = 1
RadioItem = True
OnClick = mnuVar10Click
end
object mnuVar11: TMenuItem
Caption = 'Diamond'
GroupIndex = 1
RadioItem = True
OnClick = mnuVar11Click
end
object mnuVar12: TMenuItem
Caption = 'Ex'
GroupIndex = 1
RadioItem = True
OnClick = mnuVar12Click
end
object mnuVar13: TMenuItem
Caption = 'Julia'
GroupIndex = 1
RadioItem = True
OnClick = mnuVar13Click
end
object mnuWaves: TMenuItem
Caption = 'Waves'
GroupIndex = 1
RadioItem = True
OnClick = mnuWavesClick
end
object mnuFisheye: TMenuItem
Caption = 'Fisheye'
GroupIndex = 1
RadioItem = True
OnClick = mnuFisheyeClick
end
object mnuPopcorn: TMenuItem
Caption = 'Popcorn'
GroupIndex = 1
RadioItem = True
OnClick = mnuPopcornClick
end
object MnuExponential: TMenuItem
Caption = 'Exponential'
GroupIndex = 1
RadioItem = True
OnClick = MnuExponentialClick
end
object mnuPower: TMenuItem
Caption = 'Power'
GroupIndex = 1
RadioItem = True
OnClick = mnuPowerClick
end
object mnuCosine: TMenuItem
Caption = 'Cosine'
GroupIndex = 1
RadioItem = True
OnClick = mnuCosineClick
end
object mnuRings: TMenuItem
Caption = 'Rings'
GroupIndex = 1
RadioItem = True
OnClick = mnuRingsClick
end
object mnuFan: TMenuItem
Caption = 'Fan'
GroupIndex = 1
OnClick = mnuFanClick
end
end end
object mnuScript: TMenuItem object mnuScript: TMenuItem
Caption = 'Script' Caption = 'Script'

View File

@ -37,31 +37,6 @@ const
RS_DR = 1; RS_DR = 1;
RS_XO = 2; RS_XO = 2;
RS_VO = 3; RS_VO = 3;
varnames: array[0..NVARS -1] of PChar = (
'linear',
'sinusoidal',
'spherical',
'swirl',
'horseshoe',
'polar',
'handkerchief',
'heart',
'disc',
'spiral',
'hyperbolic',
'diamond',
'ex',
'julia',
'bent',
'waves',
'fisheye',
'popcorn',
'exponential',
'power',
'cosine',
'rings',
'fan'
);
type type
TMouseMoveState = (msUsual, msZoomWindow, msZoomWindowMove, msDrag, msDragMove, msRotate, msRotateMove); TMouseMoveState = (msUsual, msZoomWindow, msZoomWindowMove, msDrag, msDragMove, msRotate, msRotateMove);
@ -104,13 +79,6 @@ type
RedrawTimer: TTimer; RedrawTimer: TTimer;
mnuVar: TMenuItem; mnuVar: TMenuItem;
mnuVRandom: TMenuItem; mnuVRandom: TMenuItem;
mnuVLinear: TMenuItem;
mnuSinusoidal: TMenuItem;
mnuSpherical: TMenuItem;
mnuHorseshoe: TMenuItem;
mnuSwirl: TMenuItem;
mnuPolar: TMenuItem;
mnuVar6: TMenuItem;
N3: TMenuItem; N3: TMenuItem;
mnuOpen: TMenuItem; mnuOpen: TMenuItem;
mnuSaveAs: TMenuItem; mnuSaveAs: TMenuItem;
@ -169,14 +137,6 @@ type
mnuCalculateColors: TMenuItem; mnuCalculateColors: TMenuItem;
mnuRandomizeColorValues: TMenuItem; mnuRandomizeColorValues: TMenuItem;
N7: TMenuItem; N7: TMenuItem;
N17: TMenuItem;
mnuVar7: TMenuItem;
mnuVar8: TMenuItem;
mnuVar9: TMenuItem;
mnuVar10: TMenuItem;
mnuVar11: TMenuItem;
mnuVar12: TMenuItem;
mnuVar13: TMenuItem;
N18: TMenuItem; N18: TMenuItem;
N19: TMenuItem; N19: TMenuItem;
btnDefine: TToolButton; btnDefine: TToolButton;
@ -194,7 +154,6 @@ type
N10: TMenuItem; N10: TMenuItem;
mnuManageFavorites: TMenuItem; mnuManageFavorites: TMenuItem;
mnuShowFull: TMenuItem; mnuShowFull: TMenuItem;
mnuVar14: TMenuItem;
mnuImageSize: TMenuItem; mnuImageSize: TMenuItem;
N13: TMenuItem; N13: TMenuItem;
ApplicationEvents: TApplicationEvents; ApplicationEvents: TApplicationEvents;
@ -209,22 +168,13 @@ type
HTTP: TIdHTTP; HTTP: TIdHTTP;
ListXmlScanner: TEasyXmlScanner; ListXmlScanner: TEasyXmlScanner;
N21: TMenuItem; N21: TMenuItem;
mnuWaves: TMenuItem;
mnuFisheye: TMenuItem;
mnuPopcorn: TMenuItem;
XmlScanner: TXmlScanner; XmlScanner: TXmlScanner;
mnuFlamepdf: TMenuItem; mnuFlamepdf: TMenuItem;
MnuExponential: TMenuItem;
mnuPower: TMenuItem;
mnuCosine: TMenuItem;
mnuRings: TMenuItem;
ToolButton4: TToolButton; ToolButton4: TToolButton;
tbzoomwindow: TToolButton; tbzoomwindow: TToolButton;
tbDrag: TToolButton; tbDrag: TToolButton;
tbRotate: TToolButton; tbRotate: TToolButton;
mnuimage: TMenuItem; mnuimage: TMenuItem;
mnuFan: TMenuItem;
procedure mnuFanClick(Sender: TObject);
procedure mnuimageClick(Sender: TObject); procedure mnuimageClick(Sender: TObject);
procedure mnuExitClick(Sender: TObject); procedure mnuExitClick(Sender: TObject);
procedure mnuSaveUPRClick(Sender: TObject); procedure mnuSaveUPRClick(Sender: TObject);
@ -258,13 +208,6 @@ type
procedure MainViewClick(Sender: TObject); procedure MainViewClick(Sender: TObject);
procedure MainToolsClick(Sender: TObject); procedure MainToolsClick(Sender: TObject);
procedure MainHelpClick(Sender: TObject); procedure MainHelpClick(Sender: TObject);
procedure mnuVLinearClick(Sender: TObject);
procedure mnuSinusoidalClick(Sender: TObject);
procedure mnuSphericalClick(Sender: TObject);
procedure mnuSwirlClick(Sender: TObject);
procedure mnuHorseshoeClick(Sender: TObject);
procedure mnuPolarClick(Sender: TObject);
procedure mnuVar6Click(Sender: TObject);
procedure mnuVRandomClick(Sender: TObject); procedure mnuVRandomClick(Sender: TObject);
procedure mnuSaveAsClick(Sender: TObject); procedure mnuSaveAsClick(Sender: TObject);
procedure mnuOpenClick(Sender: TObject); procedure mnuOpenClick(Sender: TObject);
@ -292,13 +235,6 @@ type
procedure FormDeactivate(Sender: TObject); procedure FormDeactivate(Sender: TObject);
procedure mnuCalculateColorsClick(Sender: TObject); procedure mnuCalculateColorsClick(Sender: TObject);
procedure mnuRandomizeColorValuesClick(Sender: TObject); procedure mnuRandomizeColorValuesClick(Sender: TObject);
procedure mnuVar7Click(Sender: TObject);
procedure mnuVar8Click(Sender: TObject);
procedure mnuVar9Click(Sender: TObject);
procedure mnuVar10Click(Sender: TObject);
procedure mnuVar11Click(Sender: TObject);
procedure mnuVar12Click(Sender: TObject);
procedure mnuVar13Click(Sender: TObject);
procedure mnuEditScriptClick(Sender: TObject); procedure mnuEditScriptClick(Sender: TObject);
procedure btnRunClick(Sender: TObject); procedure btnRunClick(Sender: TObject);
procedure mnuRunClick(Sender: TObject); procedure mnuRunClick(Sender: TObject);
@ -307,7 +243,6 @@ type
procedure mnuImportGimpClick(Sender: TObject); procedure mnuImportGimpClick(Sender: TObject);
procedure mnuManageFavoritesClick(Sender: TObject); procedure mnuManageFavoritesClick(Sender: TObject);
procedure mnuShowFullClick(Sender: TObject); procedure mnuShowFullClick(Sender: TObject);
procedure mnuVar14Click(Sender: TObject);
procedure mnuImageSizeClick(Sender: TObject); procedure mnuImageSizeClick(Sender: TObject);
procedure ApplicationEventsActivate(Sender: TObject); procedure ApplicationEventsActivate(Sender: TObject);
procedure mnuPasteClick(Sender: TObject); procedure mnuPasteClick(Sender: TObject);
@ -325,14 +260,7 @@ type
Attributes: TAttrList); Attributes: TAttrList);
procedure XMLScannerEmptyTag(Sender: TObject; TagName: string; procedure XMLScannerEmptyTag(Sender: TObject; TagName: string;
Attributes: TAttrList); Attributes: TAttrList);
procedure mnuWavesClick(Sender: TObject);
procedure mnuFisheyeClick(Sender: TObject);
procedure mnuPopcornClick(Sender: TObject);
procedure mnuFlamepdfClick(Sender: TObject); procedure mnuFlamepdfClick(Sender: TObject);
procedure MnuExponentialClick(Sender: TObject);
procedure mnuPowerClick(Sender: TObject);
procedure mnuCosineClick(Sender: TObject);
procedure mnuRingsClick(Sender: TObject);
procedure ImageMouseDown(Sender: TObject; Button: TMouseButton; procedure ImageMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); Shift: TShiftState; X, Y: Integer);
procedure ImageMouseMove(Sender: TObject; Shift: TShiftState; X, procedure ImageMouseMove(Sender: TObject; Shift: TShiftState; X,
@ -353,6 +281,9 @@ type
procedure DrawZoomWindow(ARect: TRect); procedure DrawZoomWindow(ARect: TRect);
procedure DrawRotatelines(Angle: double); procedure DrawRotatelines(Angle: double);
procedure FillVariantMenu;
procedure VariantMenuClick(Sender: TObject);
procedure FavoriteClick(Sender: TObject); procedure FavoriteClick(Sender: TObject);
procedure HandleThreadCompletion(var Message: TMessage); procedure HandleThreadCompletion(var Message: TMessage);
message WM_THREAD_COMPLETE; message WM_THREAD_COMPLETE;
@ -366,6 +297,9 @@ type
StartTime: TDateTime; StartTime: TDateTime;
Remainder: TDateTime; Remainder: TDateTime;
AnimPal: TColorMap; AnimPal: TColorMap;
VarMenus: array[0..NVARS] of TMenuItem;
procedure LoadXMLFlame(filename, name: string); procedure LoadXMLFlame(filename, name: string);
procedure DisableFavorites; procedure DisableFavorites;
procedure EnableFavorites; procedure EnableFavorites;
@ -406,7 +340,6 @@ function NumXForms(const cp: TControlPoint): integer;
procedure NormalizeWeights(var cp: TControlPoint); procedure NormalizeWeights(var cp: TControlPoint);
procedure EqualizeWeights(var cp: TControlPoint); procedure EqualizeWeights(var cp: TControlPoint);
procedure MultMatrix(var s: TMatrix; const m: TMatrix); procedure MultMatrix(var s: TMatrix; const m: TMatrix);
function Round6(x: double): double;
procedure ListFlames(FileName: string; sel: integer); procedure ListFlames(FileName: string; sel: integer);
procedure ListIFS(FileName: string; sel: integer); procedure ListIFS(FileName: string; sel: integer);
procedure AdjustScale(var cp1: TControlPoint; width, height: integer); procedure AdjustScale(var cp1: TControlPoint; width, height: integer);
@ -425,7 +358,7 @@ implementation
uses Editor, Options, Regstry, Gradient, Render, uses Editor, Options, Regstry, Gradient, Render,
FullScreen, FormRender, Mutate, Adjust, Browser, Save, About, CmapData, FullScreen, FormRender, Mutate, Adjust, Browser, Save, About, CmapData,
HtmlHlp, ScriptForm, FormFavorites, Size, FormExport, msMultiPartFormData, HtmlHlp, ScriptForm, FormFavorites, Size, FormExport, msMultiPartFormData,
Sheep, ImageColoring, RndFlame; Sheep, ImageColoring, RndFlame, XForm;
{$R *.DFM} {$R *.DFM}
@ -480,13 +413,6 @@ begin
cp1.height := height; cp1.height := height;
end; end;
function Round6(x: double): double;
// Really ugly, but it works
begin
Result := StrToFloat(Format('%.6f', [x]));
end;
procedure MultMatrix(var s: TMatrix; const m: TMatrix); procedure MultMatrix(var s: TMatrix; const m: TMatrix);
var var
a, b, c, d, e, f, g, h: double; a, b, c, d, e, f, g, h: double;
@ -703,12 +629,14 @@ begin
end; end;
procedure TMainForm.RandomizeCP(var cp1: TControlPoint; alg: integer = 0); procedure TMainForm.RandomizeCP(var cp1: TControlPoint; alg: integer = 0);
(*
var var
vrnd, Min, Max, i, j, rnd: integer; vrnd, Min, Max, i, j, rnd: integer;
Triangles: TTriangles; Triangles: TTriangles;
cmap: TColorMap; cmap: TColorMap;
r, s, theta, phi: double; r, s, theta, phi: double;
skip: boolean; skip: boolean;
*)
begin begin
cp1.Free; cp1.Free;
cp1 := RandomFlame(MainCP, alg); cp1 := RandomFlame(MainCP, alg);
@ -2088,7 +2016,7 @@ begin
begin begin
OpenFileType := ftIfs; OpenFileType := ftIfs;
Variation := vLinear; Variation := vLinear;
mnuvLinear.Checked := True; VarMenus[0].Checked := True;
end; end;
if (UpperCase(ExtractFileExt(OpenDialog.FileName)) = '.FLA') or if (UpperCase(ExtractFileExt(OpenDialog.FileName)) = '.FLA') or
(UpperCase(ExtractFileExt(OpenDialog.FileName)) = '.APO') then (UpperCase(ExtractFileExt(OpenDialog.FileName)) = '.APO') then
@ -2512,6 +2440,7 @@ begin
mnuExit.ShortCut := TextToShortCut('Alt+F4'); mnuExit.ShortCut := TextToShortCut('Alt+F4');
if VariationOptions = 0 then VariationOptions := 16383; // it shouldn't hapen but just in case; if VariationOptions = 0 then VariationOptions := 16383; // it shouldn't hapen but just in case;
UnpackVariations(VariationOptions); UnpackVariations(VariationOptions);
FillVariantMenu;
end; end;
procedure TMainForm.FormShow(Sender: TObject); procedure TMainForm.FormShow(Sender: TObject);
@ -2845,7 +2774,7 @@ begin
begin begin
{ Open *.ifs File } { Open *.ifs File }
Variation := vLinear; Variation := vLinear;
mnuVLinear.Checked := True; VarMenus[0].Checked := True;
StringToIFS(IFSStrings.Text); StringToIFS(IFSStrings.Text);
SetVariation(maincp); SetVariation(maincp);
maincp.CalcBoundBox; maincp.CalcBoundBox;
@ -3007,83 +2936,6 @@ begin
DrawFlame; DrawFlame;
end; end;
procedure TMainForm.mnuVLinearClick(Sender: TObject);
begin
mnuVLinear.Checked := True;
UpdateUndo;
Variation := vLinear;
SetVariation(maincp);
ResetLocation;
RedrawTimer.Enabled := True;
UpdateWindows;
end;
procedure TMainForm.mnuSinusoidalClick(Sender: TObject);
begin
mnuSinusoidal.Checked := True;
UpdateUndo;
Variation := vSinusoidal;
SetVariation(maincp);
ResetLocation;
RedrawTimer.Enabled := True;
UpdateWindows;
end;
procedure TMainForm.mnuSphericalClick(Sender: TObject);
begin
mnuSpherical.Checked := True;
UpdateUndo;
Variation := vSpherical;
SetVariation(maincp);
ResetLocation;
RedrawTimer.Enabled := True;
UpdateWindows;
end;
procedure TMainForm.mnuSwirlClick(Sender: TObject);
begin
mnuSwirl.Checked := True;
UpdateUndo;
Variation := vSwirl;
SetVariation(maincp);
ResetLocation;
RedrawTimer.Enabled := True;
UpdateWindows;
end;
procedure TMainForm.mnuHorseshoeClick(Sender: TObject);
begin
mnuHorseshoe.Checked := True;
UpdateUndo;
Variation := vHorseshoe;
SetVariation(maincp);
ResetLocation;
RedrawTimer.Enabled := True;
UpdateWindows;
end;
procedure TMainForm.mnuPolarClick(Sender: TObject);
begin
mnuPolar.Checked := True;
UpdateUndo;
Variation := vPolar;
SetVariation(maincp);
ResetLocation;
RedrawTimer.Enabled := True;
UpdateWindows;
end;
procedure TMainForm.mnuVar6Click(Sender: TObject);
begin
mnuVar6.Checked := True;
UpdateUndo;
Variation := vHandkerchief;
SetVariation(maincp);
ResetLocation;
RedrawTimer.Enabled := True;
UpdateWindows;
end;
procedure TMainForm.mnuVRandomClick(Sender: TObject); procedure TMainForm.mnuVRandomClick(Sender: TObject);
begin begin
mnuVRandom.Checked := True; mnuVRandom.Checked := True;
@ -3146,15 +2998,14 @@ end;
procedure TMainForm.SmoothPalette; procedure TMainForm.SmoothPalette;
{ From Draves' Smooth palette Gimp plug-in } { From Draves' Smooth palette Gimp plug-in }
var var
r, g, b: byte;
Bitmap: TBitMap; Bitmap: TBitMap;
JPEG: TJPEGImage; JPEG: TJPEGImage;
pal: TColorMap; pal: TColorMap;
strings: TStringlist; strings: TStringlist;
ident, gradient, FileName: string; ident, FileName: string;
len, len_best, color, as_is, swapd: cardinal; len, len_best, as_is, swapd: cardinal;
cmap_best, original, clist: array[0..255] of cardinal; cmap_best, original, clist: array[0..255] of cardinal;
c, p, total, j, rand, tryit, i0, i1, t, x, y, i, iw, ih: integer; p, total, j, rand, tryit, i0, i1, x, y, i, iw, ih: integer;
begin begin
Total := Trunc(NumTries * TryLength / 100); Total := Trunc(NumTries * TryLength / 100);
p := 0; p := 0;
@ -3530,82 +3381,6 @@ begin
UpdateWindows; UpdateWindows;
end; end;
procedure TMainForm.mnuVar7Click(Sender: TObject);
begin
mnuVar7.Checked := True;
UpdateUndo;
Variation := vHeart;
SetVariation(maincp);
ResetLocation;
RedrawTimer.Enabled := True;
UpdateWindows;
end;
procedure TMainForm.mnuVar8Click(Sender: TObject);
begin
mnuVar8.Checked := True;
UpdateUndo;
Variation := vDisc;
SetVariation(maincp);
ResetLocation;
RedrawTimer.Enabled := True;
UpdateWindows;
end;
procedure TMainForm.mnuVar9Click(Sender: TObject);
begin
mnuVar9.Checked := True;
UpdateUndo;
Variation := vSpiral;
SetVariation(maincp);
ResetLocation;
RedrawTimer.Enabled := True;
UpdateWindows;
end;
procedure TMainForm.mnuVar10Click(Sender: TObject);
begin
mnuVar10.Checked := True;
UpdateUndo;
Variation := vHyperbolic;
SetVariation(maincp);
ResetLocation;
RedrawTimer.Enabled := True;
UpdateWindows;
end;
procedure TMainForm.mnuVar11Click(Sender: TObject);
begin
mnuVar11.Checked := True;
UpdateUndo;
Variation := vSquare;
SetVariation(maincp);
ResetLocation;
RedrawTimer.Enabled := True;
UpdateWindows;
end;
procedure TMainForm.mnuVar12Click(Sender: TObject);
begin
mnuVar12.Checked := True;
UpdateUndo;
Variation := vEx;
SetVariation(maincp);
ResetLocation;
RedrawTimer.Enabled := True;
UpdateWindows;
end;
procedure TMainForm.mnuVar13Click(Sender: TObject);
begin
mnuVar13.Checked := True;
UpdateUndo;
Variation := vJulia;
SetVariation(maincp);
ResetLocation;
RedrawTimer.Enabled := True;
UpdateWindows;
end;
procedure TMainForm.mnuEditScriptClick(Sender: TObject); procedure TMainForm.mnuEditScriptClick(Sender: TObject);
begin begin
@ -3722,17 +3497,6 @@ begin
FullScreenForm.Show; FullScreenForm.Show;
end; end;
procedure TMainForm.mnuVar14Click(Sender: TObject);
begin
mnuVar14.Checked := True;
UpdateUndo;
Variation := vBent;
SetVariation(maincp);
ResetLocation;
RedrawTimer.Enabled := True;
UpdateWindows;
end;
procedure TMainForm.mnuImageSizeClick(Sender: TObject); procedure TMainForm.mnuImageSizeClick(Sender: TObject);
begin begin
SizeTool.Show; SizeTool.Show;
@ -4199,101 +3963,12 @@ begin
end; end;
end; end;
procedure TMainForm.mnuWavesClick(Sender: TObject);
begin
mnuWaves.Checked := True;
UpdateUndo;
Variation := vWaves;
SetVariation(maincp);
ResetLocation;
RedrawTimer.Enabled := True;
UpdateWindows;
end;
procedure TMainForm.mnuFisheyeClick(Sender: TObject);
begin
mnuFisheye.Checked := True;
UpdateUndo;
Variation := vFisheye;
SetVariation(maincp);
ResetLocation;
RedrawTimer.Enabled := True;
UpdateWindows;
end;
procedure TMainForm.mnuPopcornClick(Sender: TObject);
begin
mnuPopcorn.Checked := True;
UpdateUndo;
Variation := vPopcorn;
SetVariation(maincp);
ResetLocation;
RedrawTimer.Enabled := True;
UpdateWindows;
end;
procedure TMainForm.mnuFlamepdfClick(Sender: TObject); procedure TMainForm.mnuFlamepdfClick(Sender: TObject);
begin begin
WinShellOpen('flame.pdf'); WinShellOpen('flame.pdf');
end; end;
procedure TMainForm.MnuExponentialClick(Sender: TObject);
begin
mnuExponential.Checked := True;
UpdateUndo;
Variation := vExponential;
SetVariation(maincp);
ResetLocation;
RedrawTimer.Enabled := True;
UpdateWindows;
end;
procedure TMainForm.mnuPowerClick(Sender: TObject);
begin
mnuPower.Checked := True;
UpdateUndo;
Variation := vPower;
SetVariation(maincp);
ResetLocation;
RedrawTimer.Enabled := True;
UpdateWindows;
end;
procedure TMainForm.mnuCosineClick(Sender: TObject);
begin
mnuCosine.Checked := True;
UpdateUndo;
Variation := vCosine;
SetVariation(maincp);
ResetLocation;
RedrawTimer.Enabled := True;
UpdateWindows;
end;
procedure TMainForm.mnuRingsClick(Sender: TObject);
begin
mnuRings.Checked := True;
UpdateUndo;
Variation := vRings;
SetVariation(maincp);
ResetLocation;
RedrawTimer.Enabled := True;
UpdateWindows;
end;
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
procedure TMainForm.mnuFanClick(Sender: TObject);
begin
mnuFan.Checked := True;
UpdateUndo;
Variation := vFan;
SetVariation(maincp);
ResetLocation;
RedrawTimer.Enabled := True;
UpdateWindows;
end;
procedure TMainForm.ImageMouseDown(Sender: TObject; Button: TMouseButton; procedure TMainForm.ImageMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); Shift: TShiftState; X, Y: Integer);
var var
@ -4348,6 +4023,7 @@ begin
end; end;
end; end;
///////////////////////////////////////////////////////////////////////////////
procedure TMainForm.ImageMouseMove(Sender: TObject; Shift: TShiftState; X, procedure TMainForm.ImageMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer); Y: Integer);
var var
@ -4391,6 +4067,7 @@ begin
end; end;
end; end;
///////////////////////////////////////////////////////////////////////////////
procedure TMainForm.ImageMouseUp(Sender: TObject; Button: TMouseButton; procedure TMainForm.ImageMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); Shift: TShiftState; X, Y: Integer);
begin begin
@ -4525,6 +4202,37 @@ begin
FMouseMoveState := msRotate; FMouseMoveState := msRotate;
end; end;
///////////////////////////////////////////////////////////////////////////////
procedure TMainForm.FillVariantMenu;
var
i: integer;
NewMenuItem : TMenuItem;
begin
for i := 0 to NVARS - 1 do begin
NewMenuItem := TMenuItem.Create(self);
NewMenuItem.Caption := uppercase(varnames[i][0]) + copy(varnames[i], 2, length(varnames[i])-1);
NewMenuItem.OnClick := VariantMenuClick;
NewMenuItem.Enabled := True;
NewMenuItem.Name := 'var' + intTostr(i);
NewMenuItem.Tag := i;
NewMenuItem.GroupIndex := 2;
NewMenuItem.RadioItem := True;
VarMenus[i] := NewMenuItem;
mnuvar.Add(NewMenuItem);
end;
end;
///////////////////////////////////////////////////////////////////////////////
procedure TMainForm.VariantMenuClick(Sender: TObject);
begin
TMenuItem(Sender).Checked := True;
UpdateUndo;
Variation := TVariation(TMenuItem(Sender).Tag);
SetVariation(maincp);
ResetLocation;
RedrawTimer.Enabled := True;
UpdateWindows;
end;
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
end. end.

View File

@ -109,7 +109,8 @@ var
implementation implementation
uses Main, Global, Registry, Editor, Adjust; uses
Main, Global, Registry, Editor, Adjust, XForm;
{$R *.DFM} {$R *.DFM}

View File

@ -45,7 +45,6 @@ object OptionsForm: TOptionsForm
Width = 449 Width = 449
Height = 249 Height = 249
ActivePage = GeneralPage ActivePage = GeneralPage
TabIndex = 0
TabOrder = 0 TabOrder = 0
TabStop = False TabStop = False
object GeneralPage: TTabSheet object GeneralPage: TTabSheet
@ -152,7 +151,6 @@ object OptionsForm: TOptionsForm
Position = 100 Position = 100
TabOrder = 1 TabOrder = 1
Thousands = False Thousands = False
Wrap = False
end end
end end
object chkResize: TCheckBox object chkResize: TCheckBox
@ -374,7 +372,6 @@ object OptionsForm: TOptionsForm
Max = 12 Max = 12
Position = 2 Position = 2
TabOrder = 2 TabOrder = 2
Wrap = False
end end
object udMaxXForms: TUpDown object udMaxXForms: TUpDown
Left = 157 Left = 157
@ -386,7 +383,6 @@ object OptionsForm: TOptionsForm
Max = 12 Max = 12
Position = 6 Position = 6
TabOrder = 3 TabOrder = 3
Wrap = False
end end
end end
object chkKeepBackground: TCheckBox object chkKeepBackground: TCheckBox
@ -466,7 +462,6 @@ object OptionsForm: TOptionsForm
Max = 12 Max = 12
Position = 2 Position = 2
TabOrder = 2 TabOrder = 2
Wrap = False
end end
object udMaxMutate: TUpDown object udMaxMutate: TUpDown
Left = 157 Left = 157
@ -478,7 +473,6 @@ object OptionsForm: TOptionsForm
Max = 12 Max = 12
Position = 6 Position = 6
TabOrder = 3 TabOrder = 3
Wrap = False
end end
end end
object gpForcedSymmetry: TGroupBox object gpForcedSymmetry: TGroupBox
@ -542,7 +536,6 @@ object OptionsForm: TOptionsForm
Position = 4 Position = 4
TabOrder = 2 TabOrder = 2
Thousands = False Thousands = False
Wrap = False
end end
end end
end end
@ -759,7 +752,6 @@ object OptionsForm: TOptionsForm
Max = 64 Max = 64
Position = 2 Position = 2
TabOrder = 8 TabOrder = 8
Wrap = False
end end
object udMaxNodes: TUpDown object udMaxNodes: TUpDown
Left = 209 Left = 209
@ -772,7 +764,6 @@ object OptionsForm: TOptionsForm
Max = 64 Max = 64
Position = 2 Position = 2
TabOrder = 9 TabOrder = 9
Wrap = False
end end
object udMinHue: TUpDown object udMinHue: TUpDown
Left = 161 Left = 161
@ -781,11 +772,8 @@ object OptionsForm: TOptionsForm
Height = 21 Height = 21
HelpContext = 1032 HelpContext = 1032
Associate = txtMinHue Associate = txtMinHue
Min = 0
Max = 600 Max = 600
Position = 0
TabOrder = 10 TabOrder = 10
Wrap = False
end end
object udMaxHue: TUpDown object udMaxHue: TUpDown
Left = 257 Left = 257
@ -794,11 +782,9 @@ object OptionsForm: TOptionsForm
Height = 21 Height = 21
HelpContext = 1033 HelpContext = 1033
Associate = txtMaxHue Associate = txtMaxHue
Min = 0
Max = 600 Max = 600
Position = 600 Position = 600
TabOrder = 11 TabOrder = 11
Wrap = False
end end
object udMinSat: TUpDown object udMinSat: TUpDown
Left = 161 Left = 161
@ -807,10 +793,7 @@ object OptionsForm: TOptionsForm
Height = 21 Height = 21
HelpContext = 1034 HelpContext = 1034
Associate = txtMinSat Associate = txtMinSat
Min = 0
Position = 0
TabOrder = 12 TabOrder = 12
Wrap = False
end end
object udmaxSat: TUpDown object udmaxSat: TUpDown
Left = 257 Left = 257
@ -819,10 +802,8 @@ object OptionsForm: TOptionsForm
Height = 21 Height = 21
HelpContext = 1035 HelpContext = 1035
Associate = txtMaxSat Associate = txtMaxSat
Min = 0
Position = 100 Position = 100
TabOrder = 13 TabOrder = 13
Wrap = False
end end
object udMinLum: TUpDown object udMinLum: TUpDown
Left = 161 Left = 161
@ -831,10 +812,7 @@ object OptionsForm: TOptionsForm
Height = 21 Height = 21
HelpContext = 1036 HelpContext = 1036
Associate = txtMinLum Associate = txtMinLum
Min = 0
Position = 0
TabOrder = 14 TabOrder = 14
Wrap = False
end end
object udMaxLum: TUpDown object udMaxLum: TUpDown
Left = 257 Left = 257
@ -843,10 +821,8 @@ object OptionsForm: TOptionsForm
Height = 21 Height = 21
HelpContext = 1037 HelpContext = 1037
Associate = txtMaxLum Associate = txtMaxLum
Min = 0
Position = 100 Position = 100
TabOrder = 15 TabOrder = 15
Wrap = False
end end
end end
end end

View File

@ -15,7 +15,7 @@
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
} }
{$D-,L-,O+,Q-,R-,Y-,S-} //{$D-,L-,O+,Q-,R-,Y-,S-}
unit Options; unit Options;
interface interface
@ -209,7 +209,8 @@ var
implementation implementation
uses Main, Global, Editor, ControlPoint; uses
Main, Global, Editor, ControlPoint, XForm;
{$R *.DFM} {$R *.DFM}
procedure TOptionsForm.btnCancelClick(Sender: TObject); procedure TOptionsForm.btnCancelClick(Sender: TObject);
@ -582,7 +583,7 @@ var
i: integer; i: integer;
begin begin
for i:= 0 to NVARS - 1 do begin for i:= 0 to NVARS - 1 do begin
clbVarEnabled.AddItem(Main.varnames[i],nil); clbVarEnabled.AddItem(varnames[i],nil);
end; end;
end; end;

View File

@ -166,12 +166,21 @@ procedure TRenderer64.CreateColorMap;
var var
i: integer; i: integer;
begin begin
{$IFDEF TESTVARIANT}
for i := 0 to 255 do begin
ColorMap[i].Red := i;
ColorMap[i].Green := i;
ColorMap[i].Blue := i;
// cmap[i][3] := fcp.white_level;
end;
{$ELSE}
for i := 0 to 255 do begin for i := 0 to 255 do begin
ColorMap[i].Red := (fcp.CMap[i][0] * fcp.white_level) div 256; ColorMap[i].Red := (fcp.CMap[i][0] * fcp.white_level) div 256;
ColorMap[i].Green := (fcp.CMap[i][1] * fcp.white_level) div 256; ColorMap[i].Green := (fcp.CMap[i][1] * fcp.white_level) div 256;
ColorMap[i].Blue := (fcp.CMap[i][2] * fcp.white_level) div 256; ColorMap[i].Blue := (fcp.CMap[i][2] * fcp.white_level) div 256;
// cmap[i][3] := fcp.white_level; // cmap[i][3] := fcp.white_level;
end; end;
{$ENDIF}
end; end;
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
@ -396,10 +405,16 @@ begin
Progress(i / nrbatches); Progress(i / nrbatches);
// generate points // generate points
{$IFDEF TESTVARIANT}
// if i > 10 then
// break;
fcp.Testiterate(SUB_BATCH_SIZE, points);
{$ELSE}
case Compatibility of case Compatibility of
0: fcp.iterate_Old(SUB_BATCH_SIZE, points); 0: fcp.iterate_Old(SUB_BATCH_SIZE, points);
1: fcp.iterateXYC(SUB_BATCH_SIZE, points); 1: fcp.iterateXYC(SUB_BATCH_SIZE, points);
end; end;
{$ENDIF}
// for j := SUB_BATCH_SIZE - 1 downto 0 do // for j := SUB_BATCH_SIZE - 1 downto 0 do
// Writeln(f, FloatTostr(points[j].x) + #9 + FloatTostr(points[j].y) + #9 + FloatTostr(points[j].c)); // Writeln(f, FloatTostr(points[j].x) + #9 + FloatTostr(points[j].y) + #9 + FloatTostr(points[j].c));

View File

@ -1665,24 +1665,10 @@ begin
if (i < 0) or (i >= NVARS) then if (i < 0) or (i >= NVARS) then
i := NVARS; i := NVARS;
Variation := TVariation(i); Variation := TVariation(i);
case i of if i = -1 then
0: MainForm.mnuVLinear.checked := True; MainForm.mnuVRandom.checked := True
1: MainForm.mnuSinusoidal.checked := True;
2: MainForm.mnuSpherical.checked := True;
3: MainForm.mnuSwirl.checked := True;
4: MainForm.mnuHorseshoe.checked := True;
5: MainForm.mnuPolar.checked := True;
6: MainForm.mnuVar6.checked := True;
7: MainForm.mnuVar7.checked := True;
8: MainForm.mnuVar8.checked := True;
9: MainForm.mnuVar9.checked := True;
10: MainForm.mnuVar10.checked := True;
11: MainForm.mnuVar11.checked := True;
12: MainForm.mnuVar12.checked := True;
13: MainForm.mnuVar13.checked := True;
else else
MainForm.mnuVRandom.checked := True; MainForm.VarMenus[i].Checked := True;
end;
end end
end; end;

View File

@ -3,8 +3,42 @@ unit XForm;
interface interface
const const
NVARS = 23; {$IFDEF TESTVARIANT}
EPS = 1E-10; NVARS = 26;
{$ELSE}
NVARS = 25;
{$ENDIF}
varnames: array[0..NVARS -1] of PChar = (
'linear',
'sinusoidal',
'spherical',
'swirl',
'horseshoe',
'polar',
'handkerchief',
'heart',
'disc',
'spiral',
'hyperbolic',
'diamond',
'ex',
'julia',
'bent',
'waves',
'fisheye',
'popcorn',
'exponential',
'power',
'cosine',
'rings',
'fan',
'triblob',
'daisy'
{$IFDEF TESTVARIANT}
,'test'
{$ENDIF}
);
type type
TCalcMethod = procedure of object; TCalcMethod = procedure of object;
@ -61,7 +95,9 @@ type
procedure Cosine; // var[20] procedure Cosine; // var[20]
procedure Rings; // var[21] procedure Rings; // var[21]
procedure Fan; // var[22] procedure Fan; // var[22]
procedure Triblob; // var[23]
procedure Daisy; // var[24]
procedure TestVar; // var[NVARS - 1]
function Mul33(const M1, M2: TMatrix): TMatrix; function Mul33(const M1, M2: TMatrix): TMatrix;
function Identity: TMatrix; function Identity: TMatrix;
@ -99,6 +135,9 @@ implementation
uses uses
SysUtils, Math; SysUtils, Math;
const
EPS = 1E-10;
{ TXForm } { TXForm }
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
@ -249,6 +288,23 @@ begin
Inc(FNrFunctions); Inc(FNrFunctions);
end; end;
if (vars[23] <> 0.0) then begin
FFunctionList[FNrFunctions] := Triblob;
Inc(FNrFunctions);
end;
if (vars[24] <> 0.0) then begin
FFunctionList[FNrFunctions] := Daisy;
Inc(FNrFunctions);
end;
{$IFDEF TESTVARIANT}
if (vars[NVARS -1] <> 0.0) then begin
FFunctionList[FNrFunctions] := TestVar;
Inc(FNrFunctions);
end;
{$ENDIF}
CalculateAngle := (vars[5] <> 0.0) or (vars[6] <> 0.0) or (vars[7] <> 0.0) or (vars[8] <> 0.0) or 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); (vars[12] <> 0.0) or (vars[13] <> 0.0) or (vars[21] <> 0.0) or (vars[22] <> 0.0);
CalculateLength := False; CalculateLength := False;
@ -545,6 +601,64 @@ begin
FPy := FPy + vars[22] * r * sin(a); FPy := FPy + vars[22] * r * sin(a);
end; end;
///////////////////////////////////////////////////////////////////////////////
procedure TXForm.Triblob;
var
r : 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;
r := r * (0.6 + 0.4 * sin(3 * Angle));
FPx := FPx + vars[23] * r * cos(Angle);
FPy := FPy + vars[23] * r * sin(Angle);
end;
///////////////////////////////////////////////////////////////////////////////
procedure TXForm.Daisy;
var
r : 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;
// r := r * (0.6 + 0.4 * sin(3 * Angle));
r := r * sin(5 * Angle);
FPx := FPx + vars[24] * r * cos(Angle);
FPy := FPy + vars[24] * r * sin(Angle);
end;
///////////////////////////////////////////////////////////////////////////////
procedure TXForm.TestVar;
var
r : 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;
// r := r * (0.6 + 0.4 * sin(3 * Angle));
r := r * sin(5 * Angle);
FPx := FPx + vars[NVARS-1] * r * cos(Angle);
FPy := FPy + vars[NVARS-1] * r * sin(Angle);
end;
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
procedure TXForm.NextPoint(var px,py,pc: double); procedure TXForm.NextPoint(var px,py,pc: double);
var var
@ -892,5 +1006,6 @@ begin
c[2, 1] := Matrix[1][2]; c[2, 1] := Matrix[1][2];
end; end;
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
end. end.