4using System.Threading.Tasks;
29 : base(new
ScriptNode[] { r, i, r0, i0, dr, R, p, Palette, DimX, DimY },
43 : base(new
ScriptNode[] { r, i, r0, i0, dr, R, p, Palette, DimX },
56 : base(new
ScriptNode[] { r, i, r0, i0, dr, R, p, Palette },
59 ArgumentType.Vector },
69 : base(new
ScriptNode[] { r, i, r0, i0, dr, R, p },
83 return new string[] {
"r",
"i",
"r0",
"i0",
"dr",
"R",
"p",
"Palette",
"DimX",
"DimY" };
106 string ColorExpression =
null;
112 double Rr, Ri, pr, pi;
122 if ((Obj =
Arguments[5].AssociatedObjectValue) is Complex)
124 Complex z = (Complex)Obj;
134 if ((Obj =
Arguments[6].AssociatedObjectValue) is Complex)
136 Complex z = (Complex)Obj;
151 ColorExpression = this.Arguments[i].SubExpression;
156 Palette = ColorModels.RandomLinearAnalogousHSL.CreatePalette(1024, 16, out
int Seed,
this,
Variables);
157 ColorExpression =
"RandomLinearAnalogousHSL(1024,16," + Seed.ToString() +
")";
159 if (i < c && this.Arguments[i] is
null)
175 throw new ScriptRuntimeException(
"Parameter mismatch in call to NovaJuliaSmoothFractal(r,c,r0,i0,dr,Coefficients[,Palette][,dimx[,dimy]]).",
179 if (dimx <= 0 || dimx > 5000 || dimy <= 0 || dimy > 5000)
182 return await
CalcNovaJulia(rc, ic, r0, i0, dr, Rr, Ri, pr, pi, Palette, dimx, dimy,
184 new object[] { Palette, dimx, dimy, r0, i0, Rr, Ri, pr, pi, ColorExpression });
187 private string FractalZoomScript(
double r,
double i,
double Size,
object State)
189 object[] Parameters = (
object[])State;
190 int DimX = (int)Parameters[1];
191 int DimY = (int)Parameters[2];
192 double r0 = (double)Parameters[3];
193 double i0 = (double)Parameters[4];
194 double Rr = (double)Parameters[5];
195 double Ri = (double)Parameters[6];
196 double pr = (double)Parameters[7];
197 double pi = (double)Parameters[8];
198 string ColorExpression = (string)Parameters[9];
200 StringBuilder sb =
new StringBuilder();
202 sb.Append(
"NovaJuliaSmoothFractal(");
232 if (!
string.IsNullOrEmpty(ColorExpression))
235 sb.Append(ColorExpression);
239 sb.Append(DimX.ToString());
241 sb.Append(DimY.ToString());
244 return sb.ToString();
250 public static async Task<FractalGraph>
CalcNovaJulia(
double rCenter,
double iCenter,
double R0,
double I0,
251 double rDelta,
double Rr,
double Ri,
double pr,
double pi, SKColor[] Palette,
253 FractalZoomScript FractalZoomScript,
object State)
255 double r0, i0, r1, i1;
258 double zr, zi, zr2, zi2, zr3, zi3, zr4, zi4;
271 int Size = Width * Height;
272 double[] ColorIndex =
new double[Size];
277 r0 = rCenter - rDelta;
278 r1 = rCenter + rDelta;
280 aspect = ((double)Width) / Height;
282 i0 = iCenter - rDelta / aspect;
283 i1 = iCenter + rDelta / aspect;
285 dr = (r1 - r0) / Width;
286 di = (i1 - i0) / Height;
288 for (y = 0, i = i0, index = 0; y < Height; y++, i += di)
290 for (x = 0, r = r0; x < Width; x++, r += dr)
306 lnz = Math.Log(Math.Sqrt(zr * zr + zi * zi));
307 argz = Math.Atan2(zi, zr);
308 amp = Math.Exp(pr * lnz - pi * argz);
309 phi = pi * lnz + pr * argz;
311 zr2 = amp * Math.Cos(phi) - 1;
312 zi2 = amp * Math.Sin(phi);
319 amp = Math.Exp((pr - 1) * lnz - pi * argz);
320 phi = pi * lnz + (pr - 1) * argz;
322 zr3 = amp * Math.Cos(phi);
323 zi3 = amp * Math.Sin(phi);
325 Temp = pr * zr3 - pi * zi3;
326 zi3 = pr * zi3 + pi * zr3;
331 Temp = 1.0 / (zr3 * zr3 + zi3 * zi3);
332 zr4 = (zr2 * zr3 + zi2 * zi3) * Temp;
333 zi4 = (zi2 * zr3 - zr2 * zi3) * Temp;
335 Temp = Rr * zr4 - Ri * zi4;
336 zi4 = Ri * zr4 + Rr * zi4 + I0;
342 Temp = Math.Sqrt(zr4 * zr4 + zi4 * zi4);
344 while ((Temp > Conv) && (Temp < Div) && (n++ < N));
346 if (Temp < Conv && n < N)
347 ColorIndex[index++] = n;
349 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 Smooth Fractal Image (by Paul Derbyshire)
override async Task< IElement > EvaluateAsync(IElement[] Arguments, Variables Variables)
TODO
override IElement Evaluate(IElement[] Arguments, Variables Variables)
TODO
override string[] DefaultArgumentNames
TODO
override bool IsAsynchronous
If the node (or its decendants) include asynchronous evaluation. Asynchronous nodes should be evaluat...
NovaJuliaSmoothFractal(ScriptNode r, ScriptNode i, ScriptNode r0, ScriptNode i0, ScriptNode dr, ScriptNode R, ScriptNode p, int Start, int Length, Expression Expression)
TODO
static async Task< FractalGraph > CalcNovaJulia(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, Variables Variables, FractalZoomScript FractalZoomScript, object State)
TODO
NovaJuliaSmoothFractal(ScriptNode r, ScriptNode i, ScriptNode r0, ScriptNode i0, ScriptNode dr, ScriptNode R, ScriptNode p, ScriptNode Palette, int Start, int Length, Expression Expression)
TODO
NovaJuliaSmoothFractal(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
NovaJuliaSmoothFractal(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
Exception thrown if an image with invalid size is requested.
Defines a clickable fractal graph in the complex plane.
static async Task Smooth(double[] ColorIndex, double[] Boundary, int Width, int Height, int N, SKColor[] Palette, ScriptNode Node, Variables Variables)
TODO
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
Handles bitmap-based graphs.
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.
async Task Preview(Expression Expression, IElement Result)
Reports a preview of the final result.
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.