4using System.Threading.Tasks;
28 : base(new
ScriptNode[] { r, i, dr, R, p, Palette, DimX, DimY },
41 : base(new
ScriptNode[] { r, i, dr, R, p, Palette, DimX },
53 : base(new
ScriptNode[] { r, i, dr, R, p, Palette },
79 return new string[] {
"r",
"i",
"dr",
"R",
"p",
"Palette",
"DimX",
"DimY" };
102 string ColorExpression =
null;
107 double Rr, Ri, pr, pi;
115 if ((Obj =
Arguments[3].AssociatedObjectValue) is Complex)
117 Complex z = (Complex)Obj;
127 if ((Obj =
Arguments[4].AssociatedObjectValue) is Complex)
129 Complex z = (Complex)Obj;
144 ColorExpression = this.Arguments[i].SubExpression;
149 Palette = ColorModels.RandomLinearAnalogousHSL.CreatePalette(1024, 16, out
int Seed,
this,
Variables);
150 ColorExpression =
"RandomLinearAnalogousHSL(1024,16," + Seed.ToString() +
")";
152 if (i < c && this.Arguments[i] is
null)
168 throw new ScriptRuntimeException(
"Parameter mismatch in call to NovaMandelbrotSmoothFractal(r,c,dr,Coefficients[,Palette][,dimx[,dimy]]).",
172 if (dimx <= 0 || dimx > 5000 || dimy <= 0 || dimy > 5000)
175 return await
CalcNovaMandelbrot(rc, ic, dr, Rr, Ri, pr, pi, Palette, dimx, dimy,
177 new object[] { Palette, dimx, dimy, Rr, Ri, pr, pi, ColorExpression });
180 private string FractalZoomScript(
double r,
double i,
double Size,
object State)
182 object[] Parameters = (
object[])State;
183 int DimX = (int)Parameters[1];
184 int DimY = (int)Parameters[2];
185 double Rr = (double)Parameters[3];
186 double Ri = (double)Parameters[4];
187 double pr = (double)Parameters[5];
188 double pi = (double)Parameters[6];
189 string ColorExpression = (string)Parameters[7];
191 StringBuilder sb =
new StringBuilder();
193 sb.Append(
"NovaMandelbrotSmoothFractal(");
219 if (!
string.IsNullOrEmpty(ColorExpression))
222 sb.Append(ColorExpression);
226 sb.Append(DimX.ToString());
228 sb.Append(DimY.ToString());
231 return sb.ToString();
237 public static async Task<FractalGraph>
CalcNovaMandelbrot(
double rCenter,
double iCenter,
double rDelta,
double Rr,
double Ri,
239 FractalZoomScript FractalZoomScript,
object State)
241 double r0, i0, r1, i1;
244 double zr, zi, zr2, zi2, zr3, zi3, zr4, zi4;
257 int size = Width * Height;
258 double[] ColorIndex =
new double[size];
263 r0 = rCenter - rDelta;
264 r1 = rCenter + rDelta;
266 aspect = ((double)Width) / Height;
268 i0 = iCenter - rDelta / aspect;
269 i1 = iCenter + rDelta / aspect;
271 dr = (r1 - r0) / Width;
272 di = (i1 - i0) / Height;
274 for (y = 0, i = i0, index = 0; y < Height; y++, i += di)
276 for (x = 0, r = r0; x < Width; x++, r += dr)
292 lnz = Math.Log(Math.Sqrt(zr * zr + zi * zi));
293 argz = Math.Atan2(zi, zr);
294 amp = Math.Exp(pr * lnz - pi * argz);
295 phi = pi * lnz + pr * argz;
297 zr2 = amp * Math.Cos(phi) - 1;
298 zi2 = amp * Math.Sin(phi);
305 amp = Math.Exp((pr - 1) * lnz - pi * argz);
306 phi = pi * lnz + (pr - 1) * argz;
308 zr3 = amp * Math.Cos(phi);
309 zi3 = amp * Math.Sin(phi);
311 Temp = pr * zr3 - pi * zi3;
312 zi3 = pr * zi3 + pi * zr3;
317 Temp = 1.0 / (zr3 * zr3 + zi3 * zi3);
318 zr4 = (zr2 * zr3 + zi2 * zi3) * Temp;
319 zi4 = (zi2 * zr3 - zr2 * zi3) * Temp;
321 Temp = Rr * zr4 - Ri * zi4;
322 zi4 = Ri * zr4 + Rr * zi4 + i;
328 Temp = Math.Sqrt(zr4 * zr4 + zi4 * zi4);
330 while ((Temp > Conv) && (Temp < Div) && (n++ < N));
332 if (Temp < Conv && n < N)
333 ColorIndex[index++] = n;
335 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 Mandelbrot Fractal Image (by Paul Derbyshire)
override bool IsAsynchronous
If the node (or its decendants) include asynchronous evaluation. Asynchronous nodes should be evaluat...
override IElement Evaluate(IElement[] Arguments, Variables Variables)
TODO
override async Task< IElement > EvaluateAsync(IElement[] Arguments, Variables Variables)
TODO
NovaMandelbrotSmoothFractal(ScriptNode r, ScriptNode i, ScriptNode dr, ScriptNode R, ScriptNode p, ScriptNode Palette, ScriptNode DimX, int Start, int Length, Expression Expression)
TODO
override string[] DefaultArgumentNames
TODO
NovaMandelbrotSmoothFractal(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
NovaMandelbrotSmoothFractal(ScriptNode r, ScriptNode i, ScriptNode dr, ScriptNode R, ScriptNode p, ScriptNode Palette, int Start, int Length, Expression Expression)
TODO
static async Task< FractalGraph > CalcNovaMandelbrot(double rCenter, double iCenter, 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
NovaMandelbrotSmoothFractal(ScriptNode r, ScriptNode i, ScriptNode dr, ScriptNode R, ScriptNode p, 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.