27 : base(new
ScriptNode[] { r, i, dr, R, p, Palette, DimX, DimY },
40 : base(new
ScriptNode[] { r, i, dr, R, p, Palette, DimX },
52 : base(new
ScriptNode[] { r, i, dr, R, p, Palette },
78 return new string[] {
"r",
"i",
"dr",
"R",
"p",
"Palette",
"DimX",
"DimY" };
87 string ColorExpression =
null;
92 double Rr, Ri, pr, pi;
100 if ((Obj =
Arguments[3].AssociatedObjectValue) is Complex)
102 Complex z = (Complex)Obj;
112 if ((Obj =
Arguments[4].AssociatedObjectValue) is Complex)
114 Complex z = (Complex)Obj;
129 ColorExpression = this.Arguments[i].SubExpression;
134 Palette = ColorModels.RandomLinearAnalogousHSL.CreatePalette(1024, 16, out
int Seed,
this,
Variables);
135 ColorExpression =
"RandomLinearAnalogousHSL(1024,16," + Seed.ToString() +
")";
137 if (i < c && this.Arguments[i] is
null)
153 throw new ScriptRuntimeException(
"Parameter mismatch in call to NovaMandelbrotFractal(r,c,dr,Coefficients[,Palette][,dimx[,dimy]]).",
157 if (dimx <= 0 || dimx > 5000 || dimy <= 0 || dimy > 5000)
160 return CalcNovaMandelbrot(
Variables, rc, ic, dr, Rr, Ri, pr, pi, Palette, dimx, dimy,
this, this.FractalZoomScript,
161 new object[] { Palette, dimx, dimy, Rr, Ri, pr, pi, ColorExpression });
164 private string FractalZoomScript(
double r,
double i,
double Size,
object State)
166 object[] Parameters = (
object[])State;
167 int DimX = (int)Parameters[1];
168 int DimY = (int)Parameters[2];
169 double Rr = (double)Parameters[3];
170 double Ri = (double)Parameters[4];
171 double pr = (double)Parameters[5];
172 double pi = (double)Parameters[6];
173 string ColorExpression = (string)Parameters[7];
175 StringBuilder sb =
new StringBuilder();
177 sb.Append(
"NovaMandelbrotFractal(");
203 if (!
string.IsNullOrEmpty(ColorExpression))
206 sb.Append(ColorExpression);
210 sb.Append(DimX.ToString());
212 sb.Append(DimY.ToString());
215 return sb.ToString();
222 double pr,
double pi, SKColor[] Palette,
int Width,
int Height,
ScriptNode Node, FractalZoomScript FractalZoomScript,
object State)
227 double r0, i0, r1, i1;
230 double zr, zi, zr2, zi2, zr3, zi3, zr4, zi4;
244 greens =
new byte[N];
247 for (x = 0; x < N; x++)
251 greens[x] = cl.Green;
255 int size = Width * Height * 4;
258 byte[] rgb =
new byte[size];
261 r0 = rCenter - rDelta;
262 r1 = rCenter + rDelta;
264 aspect = ((double)Width) / Height;
266 i0 = iCenter - rDelta / aspect;
267 i1 = iCenter + rDelta / aspect;
269 dr = (r1 - r0) / Width;
270 di = (i1 - i0) / Height;
272 for (y = 0, i = i0, index = 0; y < Height; y++, i += di)
274 for (x = 0, r = r0; x < Width; x++, r += dr)
290 lnz = Math.Log(Math.Sqrt(zr * zr + zi * zi));
291 argz = Math.Atan2(zi, zr);
292 amp = Math.Exp(pr * lnz - pi * argz);
293 phi = pi * lnz + pr * argz;
295 zr2 = amp * Math.Cos(phi) - 1;
296 zi2 = amp * Math.Sin(phi);
303 amp = Math.Exp((pr - 1) * lnz - pi * argz);
304 phi = pi * lnz + (pr - 1) * argz;
306 zr3 = amp * Math.Cos(phi);
307 zi3 = amp * Math.Sin(phi);
309 Temp = pr * zr3 - pi * zi3;
310 zi3 = pr * zi3 + pi * zr3;
315 Temp = 1.0 / (zr3 * zr3 + zi3 * zi3);
316 zr4 = (zr2 * zr3 + zi2 * zi3) * Temp;
317 zi4 = (zi2 * zr3 - zr2 * zi3) * Temp;
319 Temp = Rr * zr4 - Ri * zi4;
320 zi4 = Ri * zr4 + Rr * zi4 + i;
326 Temp = Math.Sqrt(zr4 * zr4 + zi4 * zi4);
328 while ((Temp > Conv) && (Temp < Div) && (n++ < N));
330 if (Temp < Conv && n < N)
332 rgb[index++] = blues[n];
333 rgb[index++] = greens[n];
334 rgb[index++] = reds[n];
348 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
Exception thrown if an image with invalid size is requested.
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.