27 : base(new
ScriptNode[] { r, i, r0, i0, dr, R, p, Palette, DimX, DimY },
41 : base(new
ScriptNode[] { r, i, r0, i0, dr, R, p, Palette, DimX },
54 : base(new
ScriptNode[] { r, i, r0, i0, dr, R, p, Palette },
57 ArgumentType.Vector },
67 : base(new
ScriptNode[] { r, i, r0, i0, dr, R, p },
81 return new string[] {
"r",
"i",
"r0",
"i0",
"dr",
"R",
"p",
"Palette",
"DimX",
"DimY" };
90 string ColorExpression =
null;
96 double Rr, Ri, pr, pi;
106 if ((Obj =
Arguments[5].AssociatedObjectValue) is Complex)
108 Complex z = (Complex)Obj;
118 if ((Obj =
Arguments[6].AssociatedObjectValue) is Complex)
120 Complex z = (Complex)Obj;
135 ColorExpression = this.Arguments[i].SubExpression;
140 Palette = ColorModels.RandomLinearAnalogousHSL.CreatePalette(1024, 16, out
int Seed,
this,
Variables);
141 ColorExpression =
"RandomLinearAnalogousHSL(1024,16," + Seed.ToString() +
")";
143 if (i < c && this.Arguments[i] is
null)
159 throw new ScriptRuntimeException(
"Parameter mismatch in call to NovaJuliaTopographyFractal(r,c,r0,i0,dr,Coefficients[,Palette][,dimx[,dimy]]).",
163 if (dimx <= 0 || dimx > 5000 || dimy <= 0 || dimy > 5000)
166 return CalcNovaJulia(
Variables, rc, ic, r0, i0, dr, Rr, Ri, pr, pi, Palette, dimx, dimy,
this, this.FractalZoomScript,
167 new object[] { Palette, dimx, dimy, r0, i0, Rr, Ri, pr, pi, ColorExpression });
170 private string FractalZoomScript(
double r,
double i,
double Size,
object State)
172 object[] Parameters = (
object[])State;
173 int DimX = (int)Parameters[1];
174 int DimY = (int)Parameters[2];
175 double r0 = (double)Parameters[3];
176 double i0 = (double)Parameters[4];
177 double Rr = (double)Parameters[5];
178 double Ri = (double)Parameters[6];
179 double pr = (double)Parameters[7];
180 double pi = (double)Parameters[8];
181 string ColorExpression = (string)Parameters[9];
183 StringBuilder sb =
new StringBuilder();
185 sb.Append(
"NovaJuliaTopographyFractal(");
215 if (!
string.IsNullOrEmpty(ColorExpression))
218 sb.Append(ColorExpression);
222 sb.Append(DimX.ToString());
224 sb.Append(DimY.ToString());
227 return sb.ToString();
234 double rDelta,
double Rr,
double Ri,
double pr,
double pi, SKColor[] Palette,
int Width,
int Height,
ScriptNode Node,
235 FractalZoomScript FractalZoomScript,
object State)
237 double r0, i0, r1, i1;
240 double zr, zi, zr2, zi2, zr3, zi3, zr4, zi4;
253 int Size = Width * Height;
254 int[] ColorIndex =
new int[Size];
259 r0 = rCenter - rDelta;
260 r1 = rCenter + rDelta;
262 aspect = ((double)Width) / Height;
264 i0 = iCenter - rDelta / aspect;
265 i1 = iCenter + rDelta / aspect;
267 dr = (r1 - r0) / Width;
268 di = (i1 - i0) / Height;
270 for (y = 0, i = i0, index = 0; y < Height; y++, i += di)
272 for (x = 0, r = r0; x < Width; x++, r += dr)
288 lnz = Math.Log(Math.Sqrt(zr * zr + zi * zi));
289 argz = Math.Atan2(zi, zr);
290 amp = Math.Exp(pr * lnz - pi * argz);
291 phi = pi * lnz + pr * argz;
293 zr2 = amp * Math.Cos(phi) - 1;
294 zi2 = amp * Math.Sin(phi);
301 amp = Math.Exp((pr - 1) * lnz - pi * argz);
302 phi = pi * lnz + (pr - 1) * argz;
304 zr3 = amp * Math.Cos(phi);
305 zi3 = amp * Math.Sin(phi);
307 Temp = pr * zr3 - pi * zi3;
308 zi3 = pr * zi3 + pi * zr3;
313 Temp = 1.0 / (zr3 * zr3 + zi3 * zi3);
314 zr4 = (zr2 * zr3 + zi2 * zi3) * Temp;
315 zi4 = (zi2 * zr3 - zr2 * zi3) * Temp;
317 Temp = Rr * zr4 - Ri * zi4;
318 zi4 = Ri * zr4 + Rr * zi4 + I0;
324 Temp = Math.Sqrt(zr4 * zr4 + zi4 * zi4);
326 while ((Temp > Conv) && (Temp < Div) && (n++ < N));
328 if (Temp < Conv && n < N)
329 ColorIndex[index++] = n;
331 ColorIndex[index++] = N;
Script runtime exception.
Class managing a script expression.
static double ToDouble(object Object)
Converts an object to a double value.
static string ToString(double Value)
Converts a value to a string, that can be parsed as part of an expression.
Calculates a Nova Julia Topography Fractal Image (by Paul Derbyshire)
NovaJuliaTopographyFractal(ScriptNode r, ScriptNode i, ScriptNode r0, ScriptNode i0, ScriptNode dr, ScriptNode R, ScriptNode p, ScriptNode Palette, ScriptNode DimX, ScriptNode DimY, int Start, int Length, Expression Expression)
TODO
override string FunctionName
TODO
NovaJuliaTopographyFractal(ScriptNode r, ScriptNode i, ScriptNode r0, ScriptNode i0, ScriptNode dr, ScriptNode R, ScriptNode p, int Start, int Length, Expression Expression)
TODO
override string[] DefaultArgumentNames
TODO
NovaJuliaTopographyFractal(ScriptNode r, ScriptNode i, ScriptNode r0, ScriptNode i0, ScriptNode dr, ScriptNode R, ScriptNode p, ScriptNode Palette, ScriptNode DimX, int Start, int Length, Expression Expression)
TODO
NovaJuliaTopographyFractal(ScriptNode r, ScriptNode i, ScriptNode r0, ScriptNode i0, ScriptNode dr, ScriptNode R, ScriptNode p, ScriptNode Palette, int Start, int Length, Expression Expression)
TODO
override IElement Evaluate(IElement[] Arguments, Variables Variables)
TODO
static FractalGraph CalcNovaJulia(Variables Variables, double rCenter, double iCenter, double R0, double I0, double rDelta, double Rr, double Ri, double pr, double pi, SKColor[] Palette, int Width, int Height, ScriptNode Node, FractalZoomScript FractalZoomScript, object State)
TODO
Exception thrown if an image with invalid size is requested.
Defines a clickable fractal graph in the complex plane.
static PixelInformation ToPixels(double[] ColorIndex, int Width, int Height, SKColor[] Palette)
TODO
static SKColor[] ToPalette(ObjectVector Vector)
TODO
static double[] FindBoundaries(double[] ColorIndex, int Width, int Height)
TODO
Base class for multivariate funcions.
ScriptNode[] Arguments
Function arguments.
Base class for all nodes in a parsed script tree.
int Length
Length of expression covered by node.
Expression Expression
Expression of which the node is a part.
int Start
Start position in script expression.
Basic interface for all types of elements.
delegate string FractalZoomScript(double r, double i, double Size, object State)
Generates new script when zoomed.
ArgumentType
Type of parameter used in a function definition or a lambda definition.