26 : base(new
ScriptNode[] { r, i, dr, R, p, Palette, DimX, DimY },
39 : base(new
ScriptNode[] { r, i, dr, R, p, Palette, DimX },
51 : base(new
ScriptNode[] { r, i, dr, R, p, Palette },
77 return new string[] {
"r",
"i",
"dr",
"R",
"p",
"Palette",
"DimX",
"DimY" };
86 string ColorExpression =
null;
91 double Rr, Ri, pr, pi;
99 if ((Obj =
Arguments[3].AssociatedObjectValue) is Complex)
101 Complex z = (Complex)Obj;
111 if ((Obj =
Arguments[4].AssociatedObjectValue) is Complex)
113 Complex z = (Complex)Obj;
128 ColorExpression = this.Arguments[i].SubExpression;
133 Palette = ColorModels.RandomLinearAnalogousHSL.CreatePalette(1024, 16, out
int Seed,
this,
Variables);
134 ColorExpression =
"RandomLinearAnalogousHSL(1024,16," + Seed.ToString() +
")";
136 if (i < c && this.Arguments[i] is
null)
152 throw new ScriptRuntimeException(
"Parameter mismatch in call to NovaMandelbrotFractal(r,c,dr,Coefficients[,Palette][,dimx[,dimy]]).",
156 if (dimx <= 0 || dimx > 5000 || dimy <= 0 || dimy > 5000)
159 return CalcNovaMandelbrot(
Variables, rc, ic, dr, Rr, Ri, pr, pi, Palette, dimx, dimy,
this, this.FractalZoomScript,
160 new object[] { Palette, dimx, dimy, Rr, Ri, pr, pi, ColorExpression });
163 private string FractalZoomScript(
double r,
double i,
double Size,
object State)
165 object[] Parameters = (
object[])State;
166 int DimX = (int)Parameters[1];
167 int DimY = (int)Parameters[2];
168 double Rr = (double)Parameters[3];
169 double Ri = (double)Parameters[4];
170 double pr = (double)Parameters[5];
171 double pi = (double)Parameters[6];
172 string ColorExpression = (string)Parameters[7];
174 StringBuilder sb =
new StringBuilder();
176 sb.Append(
"NovaMandelbrotFractal(");
202 if (!
string.IsNullOrEmpty(ColorExpression))
205 sb.Append(ColorExpression);
209 sb.Append(DimX.ToString());
211 sb.Append(DimY.ToString());
214 return sb.ToString();
221 double pr,
double pi, SKColor[] Palette,
int Width,
int Height,
ScriptNode Node, FractalZoomScript FractalZoomScript,
object State)
226 double r0, i0, r1, i1;
229 double zr, zi, zr2, zi2, zr3, zi3, zr4, zi4;
243 greens =
new byte[N];
246 for (x = 0; x < N; x++)
250 greens[x] = cl.Green;
254 int size = Width * Height * 4;
257 byte[] rgb =
new byte[size];
260 r0 = rCenter - rDelta;
261 r1 = rCenter + rDelta;
263 aspect = ((double)Width) / Height;
265 i0 = iCenter - rDelta / aspect;
266 i1 = iCenter + rDelta / aspect;
268 dr = (r1 - r0) / Width;
269 di = (i1 - i0) / Height;
271 for (y = 0, i = i0, index = 0; y < Height; y++, i += di)
273 for (x = 0, r = r0; x < Width; x++, r += dr)
289 lnz = Math.Log(Math.Sqrt(zr * zr + zi * zi));
290 argz = Math.Atan2(zi, zr);
291 amp = Math.Exp(pr * lnz - pi * argz);
292 phi = pi * lnz + pr * argz;
294 zr2 = amp * Math.Cos(phi) - 1;
295 zi2 = amp * Math.Sin(phi);
302 amp = Math.Exp((pr - 1) * lnz - pi * argz);
303 phi = pi * lnz + (pr - 1) * argz;
305 zr3 = amp * Math.Cos(phi);
306 zi3 = amp * Math.Sin(phi);
308 Temp = pr * zr3 - pi * zi3;
309 zi3 = pr * zi3 + pi * zr3;
314 Temp = 1.0 / (zr3 * zr3 + zi3 * zi3);
315 zr4 = (zr2 * zr3 + zi2 * zi3) * Temp;
316 zi4 = (zi2 * zr3 - zr2 * zi3) * Temp;
318 Temp = Rr * zr4 - Ri * zi4;
319 zi4 = Ri * zr4 + Rr * zi4 + i;
325 Temp = Math.Sqrt(zr4 * zr4 + zi4 * zi4);
327 while ((Temp > Conv) && (Temp < Div) && (n++ < N));
329 if (Temp < Conv && n < N)
331 rgb[index++] = blues[n];
332 rgb[index++] = greens[n];
333 rgb[index++] = reds[n];
347 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 Mandelbrot Fractal Image (by Paul Derbyshire)
static FractalGraph CalcNovaMandelbrot(Variables Variables, double rCenter, double iCenter, double rDelta, double Rr, double Ri, double pr, double pi, SKColor[] Palette, int Width, int Height, ScriptNode Node, FractalZoomScript FractalZoomScript, object State)
TODO
NovaMandelbrotFractal(ScriptNode r, ScriptNode i, ScriptNode dr, ScriptNode R, ScriptNode p, int Start, int Length, Expression Expression)
TODO
NovaMandelbrotFractal(ScriptNode r, ScriptNode i, ScriptNode dr, ScriptNode R, ScriptNode p, ScriptNode Palette, ScriptNode DimX, int Start, int Length, Expression Expression)
TODO
NovaMandelbrotFractal(ScriptNode r, ScriptNode i, ScriptNode dr, ScriptNode R, ScriptNode p, ScriptNode Palette, ScriptNode DimX, ScriptNode DimY, int Start, int Length, Expression Expression)
TODO
override string FunctionName
TODO
override string[] DefaultArgumentNames
TODO
NovaMandelbrotFractal(ScriptNode r, ScriptNode i, ScriptNode dr, ScriptNode R, ScriptNode p, ScriptNode Palette, int Start, int Length, Expression Expression)
TODO
override IElement Evaluate(IElement[] Arguments, Variables Variables)
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.