28 : base(new
ScriptNode[] { r, i, r0, i0, dr, R, p, Palette, DimX, DimY },
42 : base(new
ScriptNode[] { r, i, r0, i0, dr, R, p, Palette, DimX },
55 : base(new
ScriptNode[] { r, i, r0, i0, dr, R, p, Palette },
58 ArgumentType.Vector },
68 : base(new
ScriptNode[] { r, i, r0, i0, dr, R, p },
82 return new string[] {
"r",
"i",
"r0",
"i0",
"dr",
"R",
"p",
"Palette",
"DimX",
"DimY" };
91 string ColorExpression =
null;
97 double Rr, Ri, pr, pi;
107 if ((Obj =
Arguments[5].AssociatedObjectValue) is Complex)
109 Complex z = (Complex)Obj;
119 if ((Obj =
Arguments[6].AssociatedObjectValue) is Complex)
121 Complex z = (Complex)Obj;
136 ColorExpression = this.Arguments[i].SubExpression;
141 Palette = ColorModels.RandomLinearAnalogousHSL.CreatePalette(1024, 16, out
int Seed,
this,
Variables);
142 ColorExpression =
"RandomLinearAnalogousHSL(1024,16," + Seed.ToString() +
")";
144 if (i < c && this.Arguments[i] is
null)
160 throw new ScriptRuntimeException(
"Parameter mismatch in call to NovaJuliaFractal(r,c,r0,i0,dr,Coefficients[,Palette][,dimx[,dimy]]).",
164 if (dimx <= 0 || dimx > 5000 || dimy <= 0 || dimy > 5000)
167 return CalcNovaJulia(
Variables, rc, ic, r0, i0, dr, Rr, Ri, pr, pi, Palette, dimx, dimy,
this, this.FractalZoomScript,
168 new object[] { Palette, dimx, dimy, r0, i0, Rr, Ri, pr, pi, ColorExpression });
171 private string FractalZoomScript(
double r,
double i,
double Size,
object State)
173 object[] Parameters = (
object[])State;
174 int DimX = (int)Parameters[1];
175 int DimY = (int)Parameters[2];
176 double r0 = (double)Parameters[3];
177 double i0 = (double)Parameters[4];
178 double Rr = (double)Parameters[5];
179 double Ri = (double)Parameters[6];
180 double pr = (double)Parameters[7];
181 double pi = (double)Parameters[8];
182 string ColorExpression = (string)Parameters[9];
184 StringBuilder sb =
new StringBuilder();
186 sb.Append(
"NovaJuliaFractal(");
216 if (!
string.IsNullOrEmpty(ColorExpression))
219 sb.Append(ColorExpression);
223 sb.Append(DimX.ToString());
225 sb.Append(DimY.ToString());
228 return sb.ToString();
235 double rDelta,
double Rr,
double Ri,
double pr,
double pi, SKColor[] Palette,
int Width,
int Height,
ScriptNode Node,
236 FractalZoomScript FractalZoomScript,
object State)
241 double r0, i0, r1, i1;
244 double zr, zi, zr2, zi2, zr3, zi3, zr4, zi4;
258 greens =
new byte[N];
261 for (x = 0; x < N; x++)
265 greens[x] = cl.Green;
269 int size = Width * Height * 4;
272 byte[] rgb =
new byte[size];
275 r0 = rCenter - rDelta;
276 r1 = rCenter + rDelta;
278 aspect = ((double)Width) / Height;
280 i0 = iCenter - rDelta / aspect;
281 i1 = iCenter + rDelta / aspect;
283 dr = (r1 - r0) / Width;
284 di = (i1 - i0) / Height;
286 for (y = 0, i = i0, index = 0; y < Height; y++, i += di)
288 for (x = 0, r = r0; x < Width; x++, r += dr)
304 lnz = Math.Log(Math.Sqrt(zr * zr + zi * zi));
305 argz = Math.Atan2(zi, zr);
306 amp = Math.Exp(pr * lnz - pi * argz);
307 phi = pi * lnz + pr * argz;
309 zr2 = amp * Math.Cos(phi) - 1;
310 zi2 = amp * Math.Sin(phi);
317 amp = Math.Exp((pr - 1) * lnz - pi * argz);
318 phi = pi * lnz + (pr - 1) * argz;
320 zr3 = amp * Math.Cos(phi);
321 zi3 = amp * Math.Sin(phi);
323 Temp = pr * zr3 - pi * zi3;
324 zi3 = pr * zi3 + pi * zr3;
329 Temp = 1.0 / (zr3 * zr3 + zi3 * zi3);
330 zr4 = (zr2 * zr3 + zi2 * zi3) * Temp;
331 zi4 = (zi2 * zr3 - zr2 * zi3) * Temp;
333 Temp = Rr * zr4 - Ri * zi4;
334 zi4 = Ri * zr4 + Rr * zi4 + I0;
340 Temp = Math.Sqrt(zr4 * zr4 + zi4 * zi4);
342 while ((Temp > Conv) && (Temp < Div) && (n++ < N));
344 if (Temp < Conv && n < N)
346 rgb[index++] = blues[n];
347 rgb[index++] = greens[n];
348 rgb[index++] = reds[n];
362 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 Julia Fractal Image (by Paul Derbyshire)
static FractalGraph CalcNovaJulia(Variables Variables, 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, FractalZoomScript FractalZoomScript, object State)
TODO
override string FunctionName
TODO
NovaJuliaFractal(ScriptNode r, ScriptNode i, ScriptNode r0, ScriptNode i0, ScriptNode dr, ScriptNode R, ScriptNode p, int Start, int Length, Expression Expression)
TODO
override IElement Evaluate(IElement[] Arguments, Variables Variables)
TODO
NovaJuliaFractal(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
NovaJuliaFractal(ScriptNode r, ScriptNode i, ScriptNode r0, ScriptNode i0, ScriptNode dr, ScriptNode R, ScriptNode p, ScriptNode Palette, int Start, int Length, Expression Expression)
TODO
override string[] DefaultArgumentNames
TODO
NovaJuliaFractal(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 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.