46 : base(new
ScriptNode[] { z, f, dr, Palette, DimX, DimY },
57 : base(new
ScriptNode[] { z, f, dr, Palette, DimX },
89 return new string[] {
"z",
"f",
"dr",
"Palette",
"DimX",
"DimY" };
98 string ColorExpression =
null;
109 Obj =
Arguments[i++].AssociatedObjectValue;
110 if (Obj is Complex z)
124 Obj =
Arguments[i].AssociatedObjectValue;
127 fDef = this.Arguments[i++];
129 if (f.NrArguments != 2)
130 throw new ScriptRuntimeException(
"Lambda expression in calls to MandelbrotFractal() must be of two variables (z,c).",
this);
148 ColorExpression = this.Arguments[i].SubExpression;
153 Palette = ColorModels.RandomLinearAnalogousHSL.CreatePalette(1024, 16, out
int Seed,
this,
Variables);
154 ColorExpression =
"RandomLinearAnalogousHSL(1024,16," + Seed.ToString() +
")";
156 if (i < c && this.Arguments[i] is
null)
172 throw new ScriptRuntimeException(
"Parameter mismatch in call to MandelbrotFractal(r,c,dr[,Palette][,dimx[,dimy]]).",
176 if (dimx <= 0 || dimx > 5000 || dimy <= 0 || dimy > 5000)
181 return CalcMandelbrot(rc, ic, dr, f,
Variables, Palette, dimx, dimy,
this, this.FractalZoomScript,
182 new object[] { Palette, dimx, dimy, ColorExpression, fDef });
187 new object[] { Palette, dimx, dimy, ColorExpression, fDef });
191 private string FractalZoomScript(
double r,
double i,
double Size,
object State)
193 object[] Parameters = (
object[])State;
194 int DimX = (int)Parameters[1];
195 int DimY = (int)Parameters[2];
196 string ColorExpression = (string)Parameters[3];
199 StringBuilder sb =
new StringBuilder();
201 sb.Append(
"MandelbrotFractal((");
213 if (!
string.IsNullOrEmpty(ColorExpression))
216 sb.Append(ColorExpression);
220 sb.Append(DimX.ToString());
222 sb.Append(DimY.ToString());
225 return sb.ToString();
232 SKColor[] Palette,
int Width,
int Height,
ScriptNode Node, FractalZoomScript FractalZoomScript,
object State)
237 double r0, i0, r1, i1;
240 double zr, zi, zrt, zr2, zi2;
249 greens =
new byte[N];
252 for (x = 0; x < N; x++)
256 greens[x] = cl.Green;
260 int size = Width * Height * 4;
261 byte[] rgb =
new byte[size];
264 r0 = rCenter - rDelta;
265 r1 = rCenter + rDelta;
267 aspect = ((double)Width) / Height;
269 i0 = iCenter - rDelta / aspect;
270 i1 = iCenter + rDelta / aspect;
272 dr = (r1 - r0) / Width;
273 di = (i1 - i0) / Height;
275 for (y = 0, i = i0, index = 0; y < Height; y++, i += di)
277 for (x = 0, r = r0; x < Width; x++, r += dr)
286 while (zr2 + zi2 < 9 && n < N)
290 zi = 2 * zr * zi + i;
305 rgb[index++] = blues[n];
306 rgb[index++] = greens[n];
307 rgb[index++] = reds[n];
315 return new FractalGraph(
Variables, Pixels, r0, i0, r1, i1, rDelta * 2,
true, Node,
FractalZoomScript, State);
323 ScriptNode Node, FractalZoomScript FractalZoomScript,
object State)
328 double r0, i0, r1, i1;
338 greens =
new byte[N];
341 for (x = 0; x < N; x++)
345 greens[x] = cl.Green;
349 int size = Width * Height * 4;
350 byte[] rgb =
new byte[size];
357 r0 = rCenter - rDelta;
358 r1 = rCenter + rDelta;
360 aspect = ((double)Width) / Height;
362 i0 = iCenter - rDelta / aspect;
363 i1 = iCenter + rDelta / aspect;
365 dr = (r1 - r0) / Width;
366 di = (i1 - i0) / Height;
368 for (y = 0, i = i0; y < Height; y++, i += di)
370 Complex[] Row =
new Complex[Width];
371 Complex[] Row0 =
new Complex[Width];
372 int[] Offset =
new int[Width];
375 for (x = 0, x2 = y * Width * 4, r = r0; x < Width; x++, r += dr, x2 += 4)
377 Row[x] = Row0[x] =
new Complex(r, i);
385 while (n < N && c > 0)
391 Row = Obj.AssociatedObjectValue as Complex[];
395 else if (Row.Length != c)
398 for (x = x2 = 0; x < c; x++)
427 rgb[j++] = greens[n];
437 Array.Resize(ref Row, x2);
438 Array.Resize(ref Row0, x2);
439 Array.Resize(ref Offset, x2);
446 for (x = 0; x < c; x++)
460 return new FractalGraph(
Variables, Pixels, r0, i0, r1, i1, rDelta * 2,
true, Node,
FractalZoomScript, State);
Script runtime exception.
Class managing a script expression.
static IElement Encapsulate(object Value)
Encapsulates an object.
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 Mandelbrot Fractal Image
override IElement Evaluate(IElement[] Arguments, Variables Variables)
TODO
static FractalGraph CalcMandelbrot(double rCenter, double iCenter, double rDelta, ILambdaExpression f, Variables Variables, SKColor[] Palette, int Width, int Height, ScriptNode Node, FractalZoomScript FractalZoomScript, object State)
TODO
override string FunctionName
TODO
MandelbrotFractal(ScriptNode z, ScriptNode f, ScriptNode dr, ScriptNode Palette, int Start, int Length, Expression Expression)
TODO
MandelbrotFractal(ScriptNode z, ScriptNode f, ScriptNode dr, int Start, int Length, Expression Expression)
TODO
static FractalGraph CalcMandelbrot(Variables Variables, double rCenter, double iCenter, double rDelta, SKColor[] Palette, int Width, int Height, ScriptNode Node, FractalZoomScript FractalZoomScript, object State)
TODO
MandelbrotFractal(ScriptNode z, ScriptNode f, ScriptNode dr, ScriptNode Palette, ScriptNode DimX, int Start, int Length, Expression Expression)
TODO
override string[] DefaultArgumentNames
TODO
MandelbrotFractal(ScriptNode z, ScriptNode f, ScriptNode dr, ScriptNode Palette, ScriptNode DimX, ScriptNode DimY, int Start, int Length, Expression Expression)
TODO
Exception thrown if an image with invalid size is requested.
Exception thrown if a lambda expression with invalid type is encountered.
Exception thrown if a lambda expression with invalid type is encountered.
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.
string SubExpression
Sub-expression defining the node.
Expression Expression
Expression of which the node is a part.
int Start
Start position in script expression.
void CopyTo(Variables Variables)
Copies available variables to another variable collection.
Basic interface for all types of elements.
Base interface for lambda expressions.
IElement Evaluate(IElement[] Arguments, Variables Variables)
Evaluates the lambda expression.
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.