26 : base(new
ScriptNode[] { r, i, r0, i0, dr, R, p, Palette, DimX, DimY },
40 : base(new
ScriptNode[] { r, i, r0, i0, dr, R, p, Palette, DimX },
53 : base(new
ScriptNode[] { r, i, r0, i0, dr, R, p, Palette },
56 ArgumentType.Vector },
66 : base(new
ScriptNode[] { r, i, r0, i0, dr, R, p },
80 return new string[] {
"r",
"i",
"r0",
"i0",
"dr",
"R",
"p",
"Palette",
"DimX",
"DimY" };
89 string ColorExpression =
null;
95 double Rr, Ri, pr, pi;
105 if ((Obj =
Arguments[5].AssociatedObjectValue) is Complex)
107 Complex z = (Complex)Obj;
117 if ((Obj =
Arguments[6].AssociatedObjectValue) is Complex)
119 Complex z = (Complex)Obj;
134 ColorExpression = this.Arguments[i].SubExpression;
139 Palette = ColorModels.RandomLinearAnalogousHSL.CreatePalette(1024, 16, out
int Seed,
this,
Variables);
140 ColorExpression =
"RandomLinearAnalogousHSL(1024,16," + Seed.ToString() +
")";
142 if (i < c && this.Arguments[i] is
null)
158 throw new ScriptRuntimeException(
"Parameter mismatch in call to NovaJuliaTopographyFractal(r,c,r0,i0,dr,Coefficients[,Palette][,dimx[,dimy]]).",
162 if (dimx <= 0 || dimx > 5000 || dimy <= 0 || dimy > 5000)
165 return CalcNovaJulia(
Variables, rc, ic, r0, i0, dr, Rr, Ri, pr, pi, Palette, dimx, dimy,
this, this.FractalZoomScript,
166 new object[] { Palette, dimx, dimy, r0, i0, Rr, Ri, pr, pi, ColorExpression });
169 private string FractalZoomScript(
double r,
double i,
double Size,
object State)
171 object[] Parameters = (
object[])State;
172 int DimX = (int)Parameters[1];
173 int DimY = (int)Parameters[2];
174 double r0 = (double)Parameters[3];
175 double i0 = (double)Parameters[4];
176 double Rr = (double)Parameters[5];
177 double Ri = (double)Parameters[6];
178 double pr = (double)Parameters[7];
179 double pi = (double)Parameters[8];
180 string ColorExpression = (string)Parameters[9];
182 StringBuilder sb =
new StringBuilder();
184 sb.Append(
"NovaJuliaTopographyFractal(");
214 if (!
string.IsNullOrEmpty(ColorExpression))
217 sb.Append(ColorExpression);
221 sb.Append(DimX.ToString());
223 sb.Append(DimY.ToString());
226 return sb.ToString();
233 double rDelta,
double Rr,
double Ri,
double pr,
double pi, SKColor[] Palette,
int Width,
int Height,
ScriptNode Node,
234 FractalZoomScript FractalZoomScript,
object State)
236 double r0, i0, r1, i1;
239 double zr, zi, zr2, zi2, zr3, zi3, zr4, zi4;
252 int Size = Width * Height;
253 int[] ColorIndex =
new int[Size];
258 r0 = rCenter - rDelta;
259 r1 = rCenter + rDelta;
261 aspect = ((double)Width) / Height;
263 i0 = iCenter - rDelta / aspect;
264 i1 = iCenter + rDelta / aspect;
266 dr = (r1 - r0) / Width;
267 di = (i1 - i0) / Height;
269 for (y = 0, i = i0, index = 0; y < Height; y++, i += di)
271 for (x = 0, r = r0; x < Width; x++, r += dr)
287 lnz = Math.Log(Math.Sqrt(zr * zr + zi * zi));
288 argz = Math.Atan2(zi, zr);
289 amp = Math.Exp(pr * lnz - pi * argz);
290 phi = pi * lnz + pr * argz;
292 zr2 = amp * Math.Cos(phi) - 1;
293 zi2 = amp * Math.Sin(phi);
300 amp = Math.Exp((pr - 1) * lnz - pi * argz);
301 phi = pi * lnz + (pr - 1) * argz;
303 zr3 = amp * Math.Cos(phi);
304 zi3 = amp * Math.Sin(phi);
306 Temp = pr * zr3 - pi * zi3;
307 zi3 = pr * zi3 + pi * zr3;
312 Temp = 1.0 / (zr3 * zr3 + zi3 * zi3);
313 zr4 = (zr2 * zr3 + zi2 * zi3) * Temp;
314 zi4 = (zi2 * zr3 - zr2 * zi3) * Temp;
316 Temp = Rr * zr4 - Ri * zi4;
317 zi4 = Ri * zr4 + Rr * zi4 + I0;
323 Temp = Math.Sqrt(zr4 * zr4 + zi4 * zi4);
325 while ((Temp > Conv) && (Temp < Div) && (n++ < N));
327 if (Temp < Conv && n < N)
328 ColorIndex[index++] = n;
330 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 Topography Fractal Image (by Paul Derbyshire)
NovaJuliaTopographyFractal(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
NovaJuliaTopographyFractal(ScriptNode r, ScriptNode i, ScriptNode r0, ScriptNode i0, ScriptNode dr, ScriptNode R, ScriptNode p, int Start, int Length, Expression Expression)
TODO
override string[] DefaultArgumentNames
TODO
NovaJuliaTopographyFractal(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
NovaJuliaTopographyFractal(ScriptNode r, ScriptNode i, ScriptNode r0, ScriptNode i0, ScriptNode dr, ScriptNode R, ScriptNode p, ScriptNode Palette, int Start, int Length, Expression Expression)
TODO
override IElement Evaluate(IElement[] Arguments, Variables Variables)
TODO
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
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
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.