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 NovaJuliaFractal(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(
"NovaJuliaFractal(");
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)
240 double r0, i0, r1, i1;
243 double zr, zi, zr2, zi2, zr3, zi3, zr4, zi4;
257 greens =
new byte[N];
260 for (x = 0; x < N; x++)
264 greens[x] = cl.Green;
268 int size = Width * Height * 4;
271 byte[] rgb =
new byte[size];
274 r0 = rCenter - rDelta;
275 r1 = rCenter + rDelta;
277 aspect = ((double)Width) / Height;
279 i0 = iCenter - rDelta / aspect;
280 i1 = iCenter + rDelta / aspect;
282 dr = (r1 - r0) / Width;
283 di = (i1 - i0) / Height;
285 for (y = 0, i = i0, index = 0; y < Height; y++, i += di)
287 for (x = 0, r = r0; x < Width; x++, r += dr)
303 lnz = Math.Log(Math.Sqrt(zr * zr + zi * zi));
304 argz = Math.Atan2(zi, zr);
305 amp = Math.Exp(pr * lnz - pi * argz);
306 phi = pi * lnz + pr * argz;
308 zr2 = amp * Math.Cos(phi) - 1;
309 zi2 = amp * Math.Sin(phi);
316 amp = Math.Exp((pr - 1) * lnz - pi * argz);
317 phi = pi * lnz + (pr - 1) * argz;
319 zr3 = amp * Math.Cos(phi);
320 zi3 = amp * Math.Sin(phi);
322 Temp = pr * zr3 - pi * zi3;
323 zi3 = pr * zi3 + pi * zr3;
328 Temp = 1.0 / (zr3 * zr3 + zi3 * zi3);
329 zr4 = (zr2 * zr3 + zi2 * zi3) * Temp;
330 zi4 = (zi2 * zr3 - zr2 * zi3) * Temp;
332 Temp = Rr * zr4 - Ri * zi4;
333 zi4 = Ri * zr4 + Rr * zi4 + I0;
339 Temp = Math.Sqrt(zr4 * zr4 + zi4 * zi4);
341 while ((Temp > Conv) && (Temp < Div) && (n++ < N));
343 if (Temp < Conv && n < N)
345 rgb[index++] = blues[n];
346 rgb[index++] = greens[n];
347 rgb[index++] = reds[n];
361 return new FractalGraph(
Variables, Pixels, r0, i0, r1, i1, rDelta * 2,
true, Node,
FractalZoomScript, State);
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 Fractal Image (by Paul Derbyshire)
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
override string FunctionName
TODO
NovaJuliaFractal(ScriptNode r, ScriptNode i, ScriptNode r0, ScriptNode i0, ScriptNode dr, ScriptNode R, ScriptNode p, int Start, int Length, Expression Expression)
TODO
override IElement Evaluate(IElement[] Arguments, Variables Variables)
TODO
NovaJuliaFractal(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
NovaJuliaFractal(ScriptNode r, ScriptNode i, ScriptNode r0, ScriptNode i0, ScriptNode dr, ScriptNode R, ScriptNode p, ScriptNode Palette, int Start, int Length, Expression Expression)
TODO
override string[] DefaultArgumentNames
TODO
NovaJuliaFractal(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
Defines a clickable fractal graph in the complex plane.
static SKColor[] ToPalette(ObjectVector Vector)
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.