Neuron®
The Neuron® is the basis for the creation of open and secure federated networks for smart societies.
Loading...
Searching...
No Matches
NewtonFractal.cs
1using System;
2using System.Numerics;
3using System.Text;
4using SkiaSharp;
10
12{
47 {
53 : base(new ScriptNode[] { z, dr, R, c, Palette, DimX, DimY },
54 new ArgumentType[] { ArgumentType.Scalar, ArgumentType.Scalar, ArgumentType.Scalar,
55 ArgumentType.Normal, ArgumentType.Vector, ArgumentType.Scalar, ArgumentType.Scalar},
57 {
58 }
59
65 : base(new ScriptNode[] { z, dr, R, c, Palette, DimX },
66 new ArgumentType[] { ArgumentType.Scalar, ArgumentType.Scalar, ArgumentType.Scalar,
67 ArgumentType.Normal, ArgumentType.Vector, ArgumentType.Scalar},
69 {
70 }
71
77 : base(new ScriptNode[] { z, dr, R, c, Palette },
78 new ArgumentType[] { ArgumentType.Scalar, ArgumentType.Scalar, ArgumentType.Scalar,
79 ArgumentType.Normal, ArgumentType.Vector },
81 {
82 }
83
89 : base(new ScriptNode[] { z, dr, R, c },
90 new ArgumentType[] { ArgumentType.Scalar, ArgumentType.Scalar, ArgumentType.Scalar,
91 ArgumentType.Normal },
93 {
94 }
95
99 public override string[] DefaultArgumentNames
100 {
101 get
102 {
103 return new string[] { "z", "dr", "R", "c", "Palette", "DimX", "DimY" };
104 }
105 }
106
111 {
112 string ColorExpression = null;
113 SKColor[] Palette;
114 double[] Coefficients = null;
115 Complex[] CoefficientsZ = null;
116 ILambdaExpression f = null;
117 ScriptNode fDef = null;
118 double rc, ic;
119 double dr;
120 Complex R;
121 int dimx, dimy;
122 int c = Arguments.Length;
123 int i = 0;
124 object Obj;
125
126 Obj = Arguments[i++].AssociatedObjectValue;
127 if (Obj is Complex z)
128 {
129 rc = z.Real;
130 ic = z.Imaginary;
131 }
132 else
133 {
134 rc = Expression.ToDouble(Obj);
135 ic = Expression.ToDouble(Arguments[i++].AssociatedObjectValue);
136 }
137
138 if (i >= c)
139 throw new ScriptRuntimeException("Insufficient parameters in call to NewtonFractal().", this);
140
141 dr = Expression.ToDouble(Arguments[i++].AssociatedObjectValue);
142
143 if (i < c && ((Obj = Arguments[i].AssociatedObjectValue) is double || Obj is Complex))
144 {
145 R = Expression.ToComplex(Obj);
146 i++;
147 }
148 else
149 {
150 R = Complex.One;
151
152 if (i < c && this.Arguments[i] is null)
153 i++;
154 }
155
156 if (i < c)
157 {
158 if (Arguments[i] is DoubleVector)
159 Coefficients = (double[])Arguments[i++].AssociatedObjectValue;
160 else if (Arguments[i] is ComplexVector)
161 CoefficientsZ = (Complex[])Arguments[i++].AssociatedObjectValue;
162 /*else if (Parameters[i] is RealPolynomial)
163 Coefficients = ((RealPolynomial)Arguments[i++].AssociatedObjectValue).Coefficients;
164 else if (Parameters[i] is ComplexPolynomial)
165 CoefficientsZ = ((ComplexPolynomial)Arguments[i++].AssociatedObjectValue).Coefficients;*/
166 else if (Arguments[i] is IVector)
167 {
168 IVector Vector = (IVector)Arguments[i++];
169 int j, d = Vector.Dimension;
170
171 CoefficientsZ = new Complex[d];
172 for (j = 0; j < d; j++)
173 CoefficientsZ[j] = Expression.ToComplex(Vector.GetElement(j).AssociatedObjectValue);
174 }
175 else if (Arguments[i].AssociatedObjectValue is ILambdaExpression)
176 {
178 if (f.NrArguments != 1)
179 throw new ScriptRuntimeException("Lambda expression in calls to NewtonFractal() must be of one variable.", this);
180
181 fDef = this.Arguments[i++];
182 }
183 else
184 {
185 throw new ScriptRuntimeException("Parameter " + (i + 1).ToString() +
186 " in call to NewtonFractal has to be a vector of numbers, containing coefficients " +
187 "of the polynomial to use. Now it was of type " + Arguments[i].GetType().FullName,
188 this);
189 }
190 }
191 else
192 throw new ScriptRuntimeException("Missing coefficients or lambda expression.", this);
193
194 if (i < c && !(this.Arguments[i] is null) && Arguments[i] is ObjectVector)
195 {
196 ColorExpression = this.Arguments[i].SubExpression;
198 }
199 else
200 {
201 Palette = ColorModels.RandomLinearAnalogousHSL.CreatePalette(128, 4, out int Seed, this, Variables);
202 ColorExpression = "RandomLinearAnalogousHSL(128,4," + Seed.ToString() + ")";
203
204 if (i < c && this.Arguments[i] is null)
205 i++;
206 }
207
208 if (i < c)
209 dimx = (int)Expression.ToDouble(Arguments[i++].AssociatedObjectValue);
210 else
211 dimx = 320;
212
213 if (i < c)
214 dimy = (int)Expression.ToDouble(Arguments[i++].AssociatedObjectValue);
215 else
216 dimy = 200;
217
218 if (i < c)
219 {
220 throw new ScriptRuntimeException("Parameter mismatch in call to NewtonFractal(r,c,dr,Coefficients[,Palette][,dimx[,dimy]]).",
221 this);
222 }
223
224 if (dimx <= 0 || dimx > 5000 || dimy <= 0 || dimy > 5000)
225 throw new ScriptRuntimeException("Image size must be within 1x1 to 5000x5000", this);
226
227 if (!(f is null))
228 {
229 return CalcNewton(rc, ic, dr, R, f, fDef, Variables, Palette, dimx, dimy,
230 this, this.FractalZoomScript, new object[] { Palette, dimx, dimy, R, fDef, ColorExpression });
231 }
232 else if (!(CoefficientsZ is null))
233 {
234 return CalcNewton(Variables, rc, ic, dr, R, CoefficientsZ, Palette, dimx, dimy,
235 this, this.FractalZoomScript, new object[] { Palette, dimx, dimy, R, CoefficientsZ, ColorExpression });
236 }
237 else
238 {
239 return CalcNewton(Variables, rc, ic, dr, R, Coefficients, Palette, dimx, dimy,
240 this, this.FractalZoomScript, new object[] { Palette, dimx, dimy, R, Coefficients, ColorExpression });
241 }
242 }
243
244 private string FractalZoomScript(double r, double i, double Size, object State)
245 {
246 object[] Parameters = (object[])State;
247 int DimX = (int)Parameters[1];
248 int DimY = (int)Parameters[2];
249 Complex R = (Complex)Parameters[3];
250 double[] Coefficients = Parameters[4] as double[];
251 string ColorExpression = (string)Parameters[5];
252
253 StringBuilder sb = new StringBuilder();
254
255 sb.Append("NewtonFractal((");
256 sb.Append(Expression.ToString(r));
257 sb.Append(',');
258 sb.Append(Expression.ToString(i));
259 sb.Append("),");
260 sb.Append(Expression.ToString(Size / 4));
261 sb.Append(',');
262 sb.Append(Expression.ToString(R));
263 sb.Append(',');
264
265 if (Parameters[4] is ScriptNode fDef)
266 sb.Append(fDef.SubExpression);
267 else if (Parameters[4] is Complex[] CoefficientsZ)
268 sb.Append(Expression.ToString(CoefficientsZ));
269 else
270 sb.Append(Expression.ToString(Coefficients));
271
272 if (!string.IsNullOrEmpty(ColorExpression))
273 {
274 sb.Append(',');
275 sb.Append(ColorExpression);
276 }
277
278 sb.Append(',');
279 sb.Append(DimX.ToString());
280 sb.Append(',');
281 sb.Append(DimY.ToString());
282 sb.Append(')');
283
284 return sb.ToString();
285 }
286
290 public static FractalGraph CalcNewton(Variables Variables, double rCenter, double iCenter, double rDelta, Complex R,
291 double[] Coefficients, SKColor[] Palette, int Width, int Height, ScriptNode Node, FractalZoomScript FractalZoomScript,
292 object State)
293 {
294 byte[] reds;
295 byte[] greens;
296 byte[] blues;
297 double r0, i0, r1, i1;
298 double dr, di;
299 double r, i;
300 double zr, zi, zr2, zi2, zr3, zi3, zr4, zi4;
301 double RRe = R.Real;
302 double RIm = R.Imaginary;
303 double aspect;
304 double Temp;
305 int x, y;
306 int n, N;
307 int index;
308 int Degree = Coefficients.Length - 1;
309 SKColor cl;
310
311 N = Palette.Length;
312 reds = new byte[N];
313 greens = new byte[N];
314 blues = new byte[N];
315
316 for (x = 0; x < N; x++)
317 {
318 cl = Palette[x];
319 reds[x] = cl.Red;
320 greens[x] = cl.Green;
321 blues[x] = cl.Blue;
322 }
323
324 if (Degree < 2)
325 {
326 Array.Resize(ref Coefficients, 3);
327 while (Degree < 2)
328 Coefficients[++Degree] = 0;
329 }
330
331 double[] Prim = new double[Degree];
332 for (x = 1; x <= Degree; x++)
333 Prim[x - 1] = x * Coefficients[x];
334
335 Array.Reverse(Prim);
336 Coefficients = (double[])Coefficients.Clone();
337 Array.Reverse(Coefficients);
338
339 int size = Width * Height * 4;
340 double Conv = 1e-10;
341 double Div = 1e10;
342 byte[] rgb = new byte[size];
343
344 rDelta *= 0.5;
345 r0 = rCenter - rDelta;
346 r1 = rCenter + rDelta;
347
348 aspect = ((double)Width) / Height;
349
350 i0 = iCenter - rDelta / aspect;
351 i1 = iCenter + rDelta / aspect;
352
353 dr = (r1 - r0) / Width;
354 di = (i1 - i0) / Height;
355
356 for (y = 0, i = i0, index = 0; y < Height; y++, i += di)
357 {
358 for (x = 0, r = r0; x < Width; x++, r += dr)
359 {
360 zr = r;
361 zi = i;
362
363 n = 0;
364 do
365 {
366 // f:
367 zr2 = zi2 = 0;
368 foreach (double C in Coefficients)
369 {
370 Temp = zr2 * zr - zi2 * zi + C;
371 zi2 = zr2 * zi + zi2 * zr;
372 zr2 = Temp;
373 }
374
375 // f':
376 zr3 = zi3 = 0;
377 foreach (double C in Prim)
378 {
379 Temp = zr3 * zr - zi3 * zi + C;
380 zi3 = zr3 * zi + zi3 * zr;
381 zr3 = Temp;
382 }
383
384 // f/f':
385
386 Temp = 1.0 / (zr3 * zr3 + zi3 * zi3);
387 zr4 = (zr2 * zr3 + zi2 * zi3) * Temp;
388 zi4 = (zi2 * zr3 - zr2 * zi3) * Temp;
389
390 // R*f/f'
391 Temp = zr4 * RRe - zi4 * RIm;
392 zi4 = zr4 * RIm + zi4 * RRe;
393 zr4 = Temp;
394
395 zr -= zr4;
396 zi -= zi4;
397
398 Temp = Math.Sqrt(zr4 * zr4 + zi4 * zi4);
399 }
400 while ((Temp > Conv) && (Temp < Div) && (n++ < N));
401
402 if (Temp < Conv && n < N)
403 {
404 rgb[index++] = blues[n];
405 rgb[index++] = greens[n];
406 rgb[index++] = reds[n];
407 }
408 else
409 {
410 rgb[index++] = 0;
411 rgb[index++] = 0;
412 rgb[index++] = 0;
413 }
414
415 rgb[index++] = 255;
416 }
417 }
418
419 PixelInformation Pixels = new PixelInformationRaw(SKColorType.Bgra8888, rgb, Width, Height, Width << 2);
420 return new FractalGraph(Variables, Pixels, r0, i0, r1, i1, rDelta * 2, true, Node, FractalZoomScript, State);
421 }
422
426 public static FractalGraph CalcNewton(Variables Variables, double rCenter, double iCenter, double rDelta, Complex R,
427 Complex[] Coefficients, SKColor[] Palette, int Width, int Height, ScriptNode Node, FractalZoomScript FractalZoomScript,
428 object State)
429 {
430 byte[] reds;
431 byte[] greens;
432 byte[] blues;
433 double RRe = R.Real;
434 double RIm = R.Imaginary;
435 double r0, i0, r1, i1;
436 double dr, di;
437 double r, i;
438 double zr, zi, zr2, zi2, zr3, zi3, zr4, zi4;
439 double aspect;
440 double Temp;
441 int x, y;
442 int n, N;
443 int index;
444 int Degree = Coefficients.Length - 1;
445 SKColor cl;
446
447 N = Palette.Length;
448 reds = new byte[N];
449 greens = new byte[N];
450 blues = new byte[N];
451
452 for (x = 0; x < N; x++)
453 {
454 cl = Palette[x];
455 reds[x] = cl.Red;
456 greens[x] = cl.Green;
457 blues[x] = cl.Blue;
458 }
459
460 if (Degree < 2)
461 {
462 Array.Resize(ref Coefficients, 3);
463 while (Degree < 2)
464 Coefficients[++Degree] = Complex.Zero;
465 }
466
467 Complex[] Prim = new Complex[Degree];
468 for (x = 1; x <= Degree; x++)
469 Prim[x - 1] = x * Coefficients[x];
470
471 Array.Reverse(Prim);
472 Coefficients = (Complex[])Coefficients.Clone();
473 Array.Reverse(Coefficients);
474
475 int j, c = Prim.Length;
476 double[] ReC = new double[c + 1];
477 double[] ImC = new double[c + 1];
478 double[] RePrim = new double[c];
479 double[] ImPrim = new double[c];
480 Complex z;
481
482 for (j = 0; j < c; j++)
483 {
484 z = Coefficients[j];
485 ReC[j] = z.Real;
486 ImC[j] = z.Imaginary;
487
488 z = Prim[j];
489 RePrim[j] = z.Real;
490 ImPrim[j] = z.Imaginary;
491 }
492
493 z = Coefficients[j];
494 ReC[j] = z.Real;
495 ImC[j] = z.Imaginary;
496
497 int size = Width * Height * 4;
498 double Conv = 1e-10;
499 double Div = 1e10;
500 byte[] rgb = new byte[size];
501
502 rDelta *= 0.5;
503 r0 = rCenter - rDelta;
504 r1 = rCenter + rDelta;
505
506 aspect = ((double)Width) / Height;
507
508 i0 = iCenter - rDelta / aspect;
509 i1 = iCenter + rDelta / aspect;
510
511 dr = (r1 - r0) / Width;
512 di = (i1 - i0) / Height;
513
514 for (y = 0, i = i0, index = 0; y < Height; y++, i += di)
515 {
516 for (x = 0, r = r0; x < Width; x++, r += dr)
517 {
518 zr = r;
519 zi = i;
520
521 n = 0;
522 do
523 {
524 // f:
525 zr2 = zi2 = 0;
526 for (j = 0; j <= c; j++)
527 {
528 Temp = zr2 * zr - zi2 * zi + ReC[j];
529 zi2 = zr2 * zi + zi2 * zr + ImC[j];
530 zr2 = Temp;
531 }
532
533 // f':
534 zr3 = zi3 = 0;
535 for (j = 0; j < c; j++)
536 {
537 Temp = zr3 * zr - zi3 * zi + RePrim[j];
538 zi3 = zr3 * zi + zi3 * zr + ImPrim[j];
539 zr3 = Temp;
540 }
541
542 // f/f':
543
544 Temp = 1.0 / (zr3 * zr3 + zi3 * zi3);
545 zr4 = (zr2 * zr3 + zi2 * zi3) * Temp;
546 zi4 = (zi2 * zr3 - zr2 * zi3) * Temp;
547
548 // R*f/f'
549 Temp = zr4 * RRe - zi4 * RIm;
550 zi4 = zr4 * RIm + zi4 * RRe;
551 zr4 = Temp;
552
553 zr -= zr4;
554 zi -= zi4;
555
556 Temp = Math.Sqrt(zr4 * zr4 + zi4 * zi4);
557 }
558 while ((Temp > Conv) && (Temp < Div) && (n++ < N));
559
560 if (Temp < Conv && n < N)
561 {
562 rgb[index++] = blues[n];
563 rgb[index++] = greens[n];
564 rgb[index++] = reds[n];
565 }
566 else
567 {
568 rgb[index++] = 0;
569 rgb[index++] = 0;
570 rgb[index++] = 0;
571 }
572
573 rgb[index++] = 255;
574 }
575 }
576
577 PixelInformation Pixels = new PixelInformationRaw(SKColorType.Bgra8888, rgb, Width, Height, Width << 2);
578 return new FractalGraph(Variables, Pixels, r0, i0, r1, i1, rDelta * 2, true, Node, FractalZoomScript, State);
579 }
580
584 public static FractalGraph CalcNewton(double rCenter, double iCenter, double rDelta, Complex R,
585 ILambdaExpression f, ScriptNode _, Variables Variables, SKColor[] Palette, int Width, int Height,
586 ScriptNode Node, FractalZoomScript FractalZoomScript, object State)
587 {
588 byte[] reds;
589 byte[] greens;
590 byte[] blues;
591 double RRe = R.Real;
592 double RIm = R.Imaginary;
593 double r0, i0, r1, i1;
594 double dr, di;
595 double r, i;
596 double aspect;
597 int x, y;
598 int n, N;
599 SKColor cl;
600 Complex z;
601
602 N = Palette.Length;
603 reds = new byte[N];
604 greens = new byte[N];
605 blues = new byte[N];
606
607 for (x = 0; x < N; x++)
608 {
609 cl = Palette[x];
610 reds[x] = cl.Red;
611 greens[x] = cl.Green;
612 blues[x] = cl.Blue;
613 }
614
615 Variables v = new Variables();
616 Variables.CopyTo(v);
617
618 if (!(f is IDifferentiable Differentiable) ||
619 !(Differentiable.Differentiate(Differentiable.DefaultVariableName, v) is ILambdaExpression fPrim))
620 {
621 throw new ScriptRuntimeException("Lambda expression not differentiable.", Node);
622 }
623
624 int size = Width * Height * 4;
625 double Conv = 1e-10;
626 double Div = 1e10;
627 byte[] rgb = new byte[size];
628
629 Complex[] Row;
630 Complex[] Row2;
631 Complex[] Row3;
632 int[] Offset;
633 IElement[] P = new IElement[1];
634 int j, c, x2;
635 IElement Obj, Obj2;
636 double Mod;
637
638 rDelta *= 0.5;
639 r0 = rCenter - rDelta;
640 r1 = rCenter + rDelta;
641
642 aspect = ((double)Width) / Height;
643
644 i0 = iCenter - rDelta / aspect;
645 i1 = iCenter + rDelta / aspect;
646
647 dr = (r1 - r0) / Width;
648 di = (i1 - i0) / Height;
649
650 for (y = 0, i = i0; y < Height; y++, i += di)
651 {
652 Row = new Complex[Width];
653 Offset = new int[Width];
654
655 c = Width;
656 for (x = 0, x2 = y * Width * 4, r = r0; x < Width; x++, r += dr, x2 += 4)
657 {
658 Row[x] = new Complex(r, i);
659 Offset[x] = x2;
660 }
661
662 n = 0;
663 while (n < N && c > 0)
664 {
665 n++;
666 P[0] = new ComplexVector(Row);
667 Obj = f.Evaluate(P, v);
668 Obj2 = fPrim.Evaluate(P, v);
669 Row2 = Obj.AssociatedObjectValue as Complex[];
670 Row3 = Obj2.AssociatedObjectValue as Complex[];
671
672 if (Row2 is null || Row3 is null)
673 {
674 throw new ScriptRuntimeException("Lambda expression (and its first derivative) must be able to accept complex vectors, " +
675 "and return complex vectors of equal length. Type returned: " +
676 Obj.GetType().FullName + " and " + Obj2.GetType().FullName, Node);
677 }
678 else if (Row2.Length != c || Row3.Length != c)
679 {
680 throw new ScriptRuntimeException("Lambda expression (and its first derivative) must be able to accept complex vectors, " +
681 "and return complex vectors of equal length. Length returned: " +
682 Row2.Length.ToString() + " and " + Row3.Length.ToString() +
683 ". Expected: " + c.ToString(), Node);
684 }
685
686 for (x = x2 = 0; x < c; x++)
687 {
688 j = Offset[x];
689 z = R * Row2[x] / Row3[x];
690 Row[x] -= z;
691
692 Mod = z.Magnitude;
693
694 if (Mod > Conv && Mod < Div)
695 {
696 if (x != x2)
697 Offset[x2] = j;
698
699 x2++;
700 }
701 else
702 {
703 if (n >= N)
704 {
705 rgb[j++] = 0;
706 rgb[j++] = 0;
707 rgb[j++] = 0;
708 }
709 else
710 {
711 rgb[j++] = blues[n];
712 rgb[j++] = greens[n];
713 rgb[j++] = reds[n];
714 }
715
716 rgb[j++] = 255;
717 }
718 }
719
720 if (x2 < x)
721 {
722 Array.Resize(ref Row, x2);
723 Array.Resize(ref Offset, x2);
724 c = x2;
725 }
726 }
727 }
728
729 PixelInformation Pixels = new PixelInformationRaw(SKColorType.Bgra8888, rgb, Width, Height, Width << 2);
730 return new FractalGraph(Variables, Pixels, r0, i0, r1, i1, rDelta * 2, true, Node, FractalZoomScript, State);
731 }
732
736 public override string FunctionName => nameof(NewtonFractal);
737 }
738}
Class managing a script expression.
Definition: Expression.cs:39
static Complex ToComplex(object Object)
Converts an object to a complex value.
Definition: Expression.cs:4942
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
static FractalGraph CalcNewton(Variables Variables, double rCenter, double iCenter, double rDelta, Complex R, Complex[] Coefficients, SKColor[] Palette, int Width, int Height, ScriptNode Node, FractalZoomScript FractalZoomScript, object State)
TODO
override IElement Evaluate(IElement[] Arguments, Variables Variables)
TODO
NewtonFractal(ScriptNode z, ScriptNode dr, ScriptNode R, ScriptNode c, ScriptNode Palette, ScriptNode DimX, int Start, int Length, Expression Expression)
TODO
static FractalGraph CalcNewton(double rCenter, double iCenter, double rDelta, Complex R, ILambdaExpression f, ScriptNode _, Variables Variables, SKColor[] Palette, int Width, int Height, ScriptNode Node, FractalZoomScript FractalZoomScript, object State)
TODO
NewtonFractal(ScriptNode z, ScriptNode dr, ScriptNode R, ScriptNode c, ScriptNode Palette, int Start, int Length, Expression Expression)
TODO
NewtonFractal(ScriptNode z, ScriptNode dr, ScriptNode R, ScriptNode c, int Start, int Length, Expression Expression)
TODO
NewtonFractal(ScriptNode z, ScriptNode dr, ScriptNode R, ScriptNode c, ScriptNode Palette, ScriptNode DimX, ScriptNode DimY, int Start, int Length, Expression Expression)
TODO
static FractalGraph CalcNewton(Variables Variables, double rCenter, double iCenter, double rDelta, Complex R, double[] Coefficients, SKColor[] Palette, int Width, int Height, ScriptNode Node, FractalZoomScript FractalZoomScript, object State)
TODO
Defines a clickable fractal graph in the complex plane.
Definition: FractalGraph.cs:22
static SKColor[] ToPalette(ObjectVector Vector)
TODO
Contains pixel information
Contains pixel information in a raw unencoded format.
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
override string ToString()
Definition: ScriptNode.cs:359
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
void CopyTo(Variables Variables)
Copies available variables to another variable collection.
Definition: Variables.cs:400
Basic interface for all types of elements.
Definition: IElement.cs:20
object AssociatedObjectValue
Associated object value.
Definition: IElement.cs:33
Basic interface for vectors.
Definition: IVector.cs:9
int Dimension
Dimension of vector.
Definition: IVector.cs:14
IElement GetElement(int Index)
Gets an element of the vector.
Base interface for lambda expressions.
Base interface for lambda expressions.
IElement Evaluate(IElement[] Arguments, Variables Variables)
Evaluates the lambda expression.
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