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