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