27 : base(new
ScriptNode[] { r, i, r0, i0, dr, R, p, Palette, DimX, DimY },
41 : base(new
ScriptNode[] { r, i, r0, i0, dr, R, p, Palette, DimX },
54 : base(new
ScriptNode[] { r, i, r0, i0, dr, R, p, Palette },
57 ArgumentType.Vector },
67 : base(new
ScriptNode[] { r, i, r0, i0, dr, R, p },
81 return new string[] {
"r",
"i",
"r0",
"i0",
"dr",
"R",
"p",
"Palette",
"DimX",
"DimY" };
90 string ColorExpression =
null;
96 double Rr, Ri, pr, pi;
106 if ((Obj =
Arguments[5].AssociatedObjectValue) is Complex)
108 Complex z = (Complex)Obj;
118 if ((Obj =
Arguments[6].AssociatedObjectValue) is Complex)
120 Complex z = (Complex)Obj;
135 ColorExpression = this.Arguments[i].SubExpression;
140 Palette = ColorModels.RandomLinearAnalogousHSL.CreatePalette(1024, 16, out
int Seed,
this,
Variables);
141 ColorExpression =
"RandomLinearAnalogousHSL(1024,16," + Seed.ToString() +
")";
143 if (i < c && this.Arguments[i] is
null)
159 throw new ScriptRuntimeException(
"Parameter mismatch in call to NovaJuliaSmoothFractal(r,c,r0,i0,dr,Coefficients[,Palette][,dimx[,dimy]]).",
163 if (dimx <= 0 || dimx > 5000 || dimy <= 0 || dimy > 5000)
166 return CalcNovaJulia(rc, ic, r0, i0, dr, Rr, Ri, pr, pi, Palette, dimx, dimy,
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(
"NovaJuliaSmoothFractal(");
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,
237 FractalZoomScript FractalZoomScript,
object State)
239 double r0, i0, r1, i1;
242 double zr, zi, zr2, zi2, zr3, zi3, zr4, zi4;
255 int Size = Width * Height;
256 double[] ColorIndex =
new double[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 + I0;
326 Temp = Math.Sqrt(zr4 * zr4 + zi4 * zi4);
328 while ((Temp > Conv) && (Temp < Div) && (n++ < N));
330 if (Temp < Conv && n < N)
331 ColorIndex[index++] = n;
333 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 IElement Evaluate(IElement[] Arguments, Variables Variables)
TODO
override string[] DefaultArgumentNames
TODO
NovaJuliaSmoothFractal(ScriptNode r, ScriptNode i, ScriptNode r0, ScriptNode i0, ScriptNode dr, ScriptNode R, ScriptNode p, int Start, int Length, Expression Expression)
TODO
static 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
Defines a clickable fractal graph in the complex plane.
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
static void Smooth(double[] ColorIndex, double[] Boundary, int Width, int Height, int N, SKColor[] Palette, ScriptNode Node, Variables Variables)
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.
void 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.