44 : base(new
ScriptNode[] { z, c, dr, Palette, DimX, DimY },
55 : base(new
ScriptNode[] { z, c, dr, Palette, DimX },
87 return new string[] {
"z",
"c",
"dr",
"Palette",
"DimX",
"DimY" };
96 string ColorExpression =
null;
109 Obj =
Arguments[i++].AssociatedObjectValue;
110 if (Obj is Complex z)
124 Obj =
Arguments[i++].AssociatedObjectValue;
128 throw new ScriptRuntimeException(
"Lambda expression in calls to JuliaInternalFractal() must be of one variable.",
this);
132 fDef = this.Arguments[i - 1];
134 else if (Obj is Complex z2)
155 ColorExpression = this.Arguments[i].SubExpression;
160 Palette = ColorModels.RandomLinearAnalogousHSL.CreatePalette(16, 4, out
int Seed,
this,
Variables);
161 ColorExpression =
"RandomLinearAnalogousHSL(16,4," + Seed.ToString() +
")";
163 if (i < c && this.Arguments[i] is
null)
179 throw new ScriptRuntimeException(
"Parameter mismatch in call to JuliaInternalFractal(z,c|f,dr[,Palette][,dimx[,dimy]]).",
183 if (dimx <= 0 || dimx > 5000 || dimy <= 0 || dimy > 5000)
188 return CalcJulia(rc, ic, f, fDef, dr, Palette, dimx, dimy,
this,
Variables,
189 this.FractalZoomScript,
new object[] { Palette, dimx, dimy, r0, i0, ColorExpression, fDef });
193 return CalcJulia(
Variables, rc, ic, r0, i0, dr, Palette, dimx, dimy,
this,
194 this.FractalZoomScript,
new object[] { Palette, dimx, dimy, r0, i0, ColorExpression, fDef });
198 private string FractalZoomScript(
double r,
double i,
double Size,
object State)
200 object[] Parameters = (
object[])State;
201 int DimX = (int)Parameters[1];
202 int DimY = (int)Parameters[2];
203 double r0 = (double)Parameters[3];
204 double i0 = (double)Parameters[4];
205 string ColorExpression = (string)Parameters[5];
208 StringBuilder sb =
new StringBuilder();
210 sb.Append(
"JuliaInternalFractal((");
230 if (!
string.IsNullOrEmpty(ColorExpression))
233 sb.Append(ColorExpression);
237 sb.Append(DimX.ToString());
239 sb.Append(DimY.ToString());
242 return sb.ToString();
249 SKColor[] Palette,
int Width,
int Height,
ScriptNode Node, FractalZoomScript FractalZoomScript,
object State)
254 double r0, i0, r1, i1;
257 double zr, zi, zrt, zr2, zi2;
266 greens =
new byte[N];
269 for (x = 0; x < N; x++)
273 greens[x] = cl.Green;
277 int size = Width * Height * 4;
278 byte[] rgb =
new byte[size];
281 r0 = rCenter - rDelta;
282 r1 = rCenter + rDelta;
284 aspect = ((double)Width) / Height;
286 i0 = iCenter - rDelta / aspect;
287 i1 = iCenter + rDelta / aspect;
289 dr = (r1 - r0) / Width;
290 di = (i1 - i0) / Height;
292 for (y = 0, i = i0, index = 0; y < Height; y++, i += di)
294 for (x = 0, r = r0; x < Width; x++, r += dr)
303 while (zr2 + zi2 < 9 && n < N)
306 zrt = zr2 - zi2 + R0;
307 zi = 2 * zr * zi + I0;
314 n = (int)(N * Math.Sqrt((zr2 + zi2) / 9) + 0.5);
317 rgb[index++] = blues[n];
318 rgb[index++] = greens[n];
319 rgb[index++] = reds[n];
333 return new FractalGraph(
Variables, Pixels, r0, i0, r1, i1, rDelta * 2,
true, Node,
FractalZoomScript, State);
341 FractalZoomScript FractalZoomScript,
object State)
346 double r0, i0, r1, i1;
356 greens =
new byte[N];
359 for (x = 0; x < N; x++)
363 greens[x] = cl.Green;
367 int size = Width * Height * 4;
368 byte[] rgb =
new byte[size];
375 r0 = rCenter - rDelta;
376 r1 = rCenter + rDelta;
378 int[] Counts =
new int[N];
380 aspect = ((double)Width) / Height;
382 i0 = iCenter - rDelta / aspect;
383 i1 = iCenter + rDelta / aspect;
385 dr = (r1 - r0) / Width;
386 di = (i1 - i0) / Height;
388 for (y = 0, i = i0; y < Height; y++, i += di)
390 Complex[] Row =
new Complex[Width];
391 int[] Offset =
new int[Width];
394 for (x = 0, x2 = y * Width * 4, r = r0; x < Width; x++, r += dr, x2 += 4)
396 Row[x] =
new Complex(r, i);
404 while (n < N && c > 0)
409 Row = Obj.AssociatedObjectValue as Complex[];
413 else if (Row.Length != c)
416 for (x = x2 = 0; x < c; x++)
444 Array.Resize(ref Row, x2);
445 Array.Resize(ref Offset, x2);
452 for (x = 0; x < c; x++)
458 n = (int)(N * Mod / 3 + 0.5);
464 rgb[j++] = greens[n];
483 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.
static string ToExpressionString(object Value)
Converts an object to a string, that can be parsed as part of an expression.
Calculates a Julia set Fractal Image
JuliaInternalFractal(ScriptNode z, ScriptNode c, ScriptNode dr, ScriptNode Palette, int Start, int Length, Expression Expression)
TODO
override IElement Evaluate(IElement[] Arguments, Variables Variables)
TODO
JuliaInternalFractal(ScriptNode z, ScriptNode c, ScriptNode dr, int Start, int Length, Expression Expression)
TODO
override string FunctionName
TODO
JuliaInternalFractal(ScriptNode z, ScriptNode c, ScriptNode dr, ScriptNode Palette, ScriptNode DimX, int Start, int Length, Expression Expression)
TODO
JuliaInternalFractal(ScriptNode z, ScriptNode c, ScriptNode dr, ScriptNode Palette, ScriptNode DimX, ScriptNode DimY, int Start, int Length, Expression Expression)
TODO
static FractalGraph CalcJulia(double rCenter, double iCenter, ILambdaExpression f, ScriptNode _, double rDelta, SKColor[] Palette, int Width, int Height, ScriptNode Node, Variables Variables, FractalZoomScript FractalZoomScript, object State)
TODO
override string[] DefaultArgumentNames
TODO
static FractalGraph CalcJulia(Variables Variables, double rCenter, double iCenter, double R0, double I0, double rDelta, SKColor[] Palette, int Width, int Height, ScriptNode Node, FractalZoomScript FractalZoomScript, object State)
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.
TextWriter ConsoleOut
Console out interface. Can be used by functions and script to output data to the console.
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.
int NrArguments
Number of arguments.
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.