Neuron®
The Neuron® is the basis for the creation of open and secure federated networks for smart societies.
Loading...
Searching...
No Matches
NovaMandelbrotTopographyFractal.cs
1using System;
2using System.Numerics;
3using System.Text;
4using SkiaSharp;
9
11{
19 {
24 ScriptNode Palette, ScriptNode DimX, ScriptNode DimY, int Start, int Length, Expression Expression)
25 : base(new ScriptNode[] { r, i, dr, R, p, Palette, DimX, DimY },
26 new ArgumentType[] { ArgumentType.Scalar, ArgumentType.Scalar, ArgumentType.Scalar,
27 ArgumentType.Scalar, ArgumentType.Scalar, ArgumentType.Vector, ArgumentType.Scalar,
28 ArgumentType.Scalar},
30 {
31 }
32
37 ScriptNode Palette, ScriptNode DimX, int Start, int Length, Expression Expression)
38 : base(new ScriptNode[] { r, i, dr, R, p, Palette, DimX },
39 new ArgumentType[] { ArgumentType.Scalar, ArgumentType.Scalar, ArgumentType.Scalar,
40 ArgumentType.Scalar, ArgumentType.Scalar, ArgumentType.Vector, ArgumentType.Scalar },
42 {
43 }
44
49 ScriptNode Palette, int Start, int Length, Expression Expression)
50 : base(new ScriptNode[] { r, i, dr, R, p, Palette },
51 new ArgumentType[] { ArgumentType.Scalar, ArgumentType.Scalar, ArgumentType.Scalar,
52 ArgumentType.Scalar, ArgumentType.Scalar, ArgumentType.Vector },
54 {
55 }
56
62 : base(new ScriptNode[] { r, i, dr, R, p },
63 new ArgumentType[] { ArgumentType.Scalar, ArgumentType.Scalar, ArgumentType.Scalar,
64 ArgumentType.Scalar, ArgumentType.Scalar },
66 {
67 }
68
72 public override string[] DefaultArgumentNames
73 {
74 get
75 {
76 return new string[] { "r", "i", "dr", "R", "p", "Palette", "DimX", "DimY" };
77 }
78 }
79
84 {
85 string ColorExpression = null;
86 SKColor[] Palette;
87 object Obj;
88 double rc, ic;
89 double dr;
90 double Rr, Ri, pr, pi;
91 int dimx, dimy;
92 int i, c;
93
94 rc = Expression.ToDouble(Arguments[0].AssociatedObjectValue);
95 ic = Expression.ToDouble(Arguments[1].AssociatedObjectValue);
96 dr = Expression.ToDouble(Arguments[2].AssociatedObjectValue);
97
98 if ((Obj = Arguments[3].AssociatedObjectValue) is Complex)
99 {
100 Complex z = (Complex)Obj;
101 Rr = z.Real;
102 Ri = z.Imaginary;
103 }
104 else
105 {
106 Rr = Expression.ToDouble(Arguments[3].AssociatedObjectValue);
107 Ri = 0;
108 }
109
110 if ((Obj = Arguments[4].AssociatedObjectValue) is Complex)
111 {
112 Complex z = (Complex)Obj;
113 pr = z.Real;
114 pi = z.Imaginary;
115 }
116 else
117 {
118 pr = Expression.ToDouble(Arguments[4].AssociatedObjectValue);
119 pi = 0;
120 }
121
122 c = Arguments.Length;
123 i = 5;
124
125 if (i < c && !(this.Arguments[i] is null) && Arguments[i] is ObjectVector)
126 {
127 ColorExpression = this.Arguments[i].SubExpression;
129 }
130 else
131 {
132 Palette = ColorModels.RandomLinearAnalogousHSL.CreatePalette(1024, 16, out int Seed, this, Variables);
133 ColorExpression = "RandomLinearAnalogousHSL(1024,16," + Seed.ToString() + ")";
134
135 if (i < c && this.Arguments[i] is null)
136 i++;
137 }
138
139 if (i < c)
140 dimx = (int)Expression.ToDouble(Arguments[i++].AssociatedObjectValue);
141 else
142 dimx = 320;
143
144 if (i < c)
145 dimy = (int)Expression.ToDouble(Arguments[i++].AssociatedObjectValue);
146 else
147 dimy = 200;
148
149 if (i < c)
150 {
151 throw new ScriptRuntimeException("Parameter mismatch in call to NovaMandelbrotTopographyFractal(r,c,dr,Coefficients[,Palette][,dimx[,dimy]]).",
152 this);
153 }
154
155 if (dimx <= 0 || dimx > 5000 || dimy <= 0 || dimy > 5000)
156 throw new ScriptRuntimeException("Image size must be within 1x1 to 5000x5000", this);
157
158 return CalcNovaMandelbrot(Variables, rc, ic, dr, Rr, Ri, pr, pi, Palette, dimx, dimy, this, this.FractalZoomScript,
159 new object[] { Palette, dimx, dimy, Rr, Ri, pr, pi, ColorExpression });
160 }
161
162 private string FractalZoomScript(double r, double i, double Size, object State)
163 {
164 object[] Parameters = (object[])State;
165 int DimX = (int)Parameters[1];
166 int DimY = (int)Parameters[2];
167 double Rr = (double)Parameters[3];
168 double Ri = (double)Parameters[4];
169 double pr = (double)Parameters[5];
170 double pi = (double)Parameters[6];
171 string ColorExpression = (string)Parameters[7];
172
173 StringBuilder sb = new StringBuilder();
174
175 sb.Append("NovaMandelbrotTopographyFractal(");
176 sb.Append(Expression.ToString(r));
177 sb.Append(',');
178 sb.Append(Expression.ToString(i));
179 sb.Append(',');
180 sb.Append(Expression.ToString(Size / 4));
181 sb.Append(',');
182 sb.Append(Expression.ToString(Rr));
183
184 if (Ri != 0)
185 {
186 sb.Append('+');
187 sb.Append(Expression.ToString(Ri));
188 sb.Append("*i");
189 }
190
191 sb.Append(',');
192 sb.Append(Expression.ToString(pr));
193
194 if (pi != 0)
195 {
196 sb.Append('+');
197 sb.Append(Expression.ToString(pi));
198 sb.Append("*i");
199 }
200
201 if (!string.IsNullOrEmpty(ColorExpression))
202 {
203 sb.Append(',');
204 sb.Append(ColorExpression);
205 }
206
207 sb.Append(',');
208 sb.Append(DimX.ToString());
209 sb.Append(',');
210 sb.Append(DimY.ToString());
211 sb.Append(')');
212
213 return sb.ToString();
214 }
215
219 public static FractalGraph CalcNovaMandelbrot(Variables Variables, double rCenter, double iCenter, double rDelta, double Rr, double Ri,
220 double pr, double pi, SKColor[] Palette, int Width, int Height, ScriptNode Node, FractalZoomScript FractalZoomScript, object State)
221 {
222 double r0, i0, r1, i1;
223 double dr, di;
224 double r, i;
225 double zr, zi, zr2, zi2, zr3, zi3, zr4, zi4;
226 double aspect;
227 double Temp;
228 int x, y;
229 int n, N;
230 int index;
231 double lnz;
232 double argz;
233 double amp;
234 double phi;
235
236 N = Palette.Length;
237
238 int size = Width * Height;
239 int[] ColorIndex = new int[size];
240 double Conv = 1e-10;
241 double Div = 1e10;
242
243 rDelta *= 0.5;
244 r0 = rCenter - rDelta;
245 r1 = rCenter + rDelta;
246
247 aspect = ((double)Width) / Height;
248
249 i0 = iCenter - rDelta / aspect;
250 i1 = iCenter + rDelta / aspect;
251
252 dr = (r1 - r0) / Width;
253 di = (i1 - i0) / Height;
254
255 for (y = 0, i = i0, index = 0; y < Height; y++, i += di)
256 {
257 for (x = 0, r = r0; x < Width; x++, r += dr)
258 {
259 zr = r;
260 zi = i;
261
262 n = 0;
263 do
264 {
265 // f: z->z^p-1 = exp(p*ln(z))-1
266 // exp(a+ib)=exp(a)*(cos(b)+i*sin(b))
267 // ln(z)=ln|z|+i*arg(z)
268 // exp(p*ln(z))-1 =
269 // = exp((pr+i*pi)*(ln|z|+i*arg(z)))-1 =
270 // = exp(pr*ln|z|-pi*arg(z)+i*(pi*ln|z|+pr*arg(z)))-1 =
271 // = exp(pr*ln|z|-pi*arg(z))*(cos(pi*ln|z|+pr*arg(z))+i*sin(pi*ln|z|+pr*arg(z)))-1
272
273 lnz = Math.Log(Math.Sqrt(zr * zr + zi * zi));
274 argz = Math.Atan2(zi, zr);
275 amp = Math.Exp(pr * lnz - pi * argz);
276 phi = pi * lnz + pr * argz;
277
278 zr2 = amp * Math.Cos(phi) - 1;
279 zi2 = amp * Math.Sin(phi);
280
281 // f': z->p*z^(p-1) = p*exp((p-1)*ln(z)) =
282 // = (pr+i*pi)*exp((pr-1+i*pi)*(ln|z|+i*arg(z))) =
283 // = (pr+i*pi)*exp((pr-1)*ln|z|-pi*arg(z)+i*(pi*ln|z|+(pr-1)*arg(z))) =
284 // = (pr+i*pi)*exp((pr-1)*ln|z|-pi*arg(z))(sin(pi*ln|z|+(pr-1)*arg(z))+i*cos(pi*ln|z|+(pr-1)*arg(z))) =
285
286 amp = Math.Exp((pr - 1) * lnz - pi * argz);
287 phi = pi * lnz + (pr - 1) * argz;
288
289 zr3 = amp * Math.Cos(phi);
290 zi3 = amp * Math.Sin(phi);
291
292 Temp = pr * zr3 - pi * zi3;
293 zi3 = pr * zi3 + pi * zr3;
294 zr3 = Temp;
295
296 // f/f':
297
298 Temp = 1.0 / (zr3 * zr3 + zi3 * zi3);
299 zr4 = (zr2 * zr3 + zi2 * zi3) * Temp;
300 zi4 = (zi2 * zr3 - zr2 * zi3) * Temp;
301
302 Temp = Rr * zr4 - Ri * zi4;
303 zi4 = Ri * zr4 + Rr * zi4 + i;
304 zr4 = Temp + r;
305
306 zr -= zr4;
307 zi -= zi4;
308
309 Temp = Math.Sqrt(zr4 * zr4 + zi4 * zi4);
310 }
311 while ((Temp > Conv) && (Temp < Div) && (n++ < N));
312
313 if (Temp < Conv && n < N)
314 ColorIndex[index++] = n;
315 else
316 ColorIndex[index++] = N;
317 }
318 }
319
320 ColorIndex = FractalGraph.FindBoundaries(ColorIndex, Width, Height);
321
322 return new FractalGraph(Variables, FractalGraph.ToPixels(ColorIndex, Width, Height, Palette),
323 r0, i0, r1, i1, rDelta * 2, true, Node, FractalZoomScript, State);
324 }
325
329 public override string FunctionName => nameof(NovaMandelbrotTopographyFractal);
330 }
331}
Class managing a script expression.
Definition: Expression.cs:39
static double ToDouble(object Object)
Converts an object to a double value.
Definition: Expression.cs:4824
static string ToString(double Value)
Converts a value to a string, that can be parsed as part of an expression.
Definition: Expression.cs:4496
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
NovaMandelbrotTopographyFractal(ScriptNode r, ScriptNode i, ScriptNode dr, ScriptNode R, ScriptNode p, ScriptNode Palette, int Start, int Length, Expression Expression)
TODO
NovaMandelbrotTopographyFractal(ScriptNode r, ScriptNode i, ScriptNode dr, ScriptNode R, ScriptNode p, ScriptNode Palette, ScriptNode DimX, ScriptNode DimY, int Start, int Length, Expression Expression)
TODO
NovaMandelbrotTopographyFractal(ScriptNode r, ScriptNode i, ScriptNode dr, ScriptNode R, ScriptNode p, int Start, int Length, Expression Expression)
TODO
override IElement Evaluate(IElement[] Arguments, Variables Variables)
TODO
NovaMandelbrotTopographyFractal(ScriptNode r, ScriptNode i, 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.
Definition: FractalGraph.cs:22
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.
Definition: ScriptNode.cs:69
int Length
Length of expression covered by node.
Definition: ScriptNode.cs:101
Expression Expression
Expression of which the node is a part.
Definition: ScriptNode.cs:177
int Start
Start position in script expression.
Definition: ScriptNode.cs:92
Collection of variables.
Definition: Variables.cs:25
Basic interface for all types of elements.
Definition: IElement.cs:20
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.
Definition: IFunction.cs:9