5using System.Globalization;
7using System.Threading.Tasks;
34 private Type axisTypeX;
35 private Type axisTypeY;
36 private string title =
string.Empty;
37 private string labelX =
string.Empty;
38 private string labelY =
string.Empty;
39 private bool showXAxis =
true;
40 private bool showYAxis =
true;
41 private bool showGrid =
true;
42 private bool elementwise =
false;
70 : base(
Variables, DefaultWidth, DefaultHeight)
104 int i, c =
X.Dimension;
105 bool HasNull =
false;
109 if (c !=
Y.Dimension)
112 for (i = 0; i < c; i++)
114 ex =
X.GetElement(i);
115 ey =
Y.GetElement(i);
127 if (this.minX is
null)
130 if (this.maxX is
null)
135 Zero = AG.AdditiveIdentity;
141 if (this.minY is
null)
144 if (this.maxY is
null)
149 Zero = AG2.AdditiveIdentity;
160 this.axisTypeX =
null;
161 this.axisTypeY =
null;
163 for (i = 0; i < c; i++)
165 ex =
X.GetElement(i);
166 ey =
Y.GetElement(i);
172 this.AddSegment(
X,
Y, X2, Y2, Node, Painter,
Parameters);
185 this.AddSegment(
X,
Y, X2, Y2, Node, Painter,
Parameters);
189 this.axisTypeX =
X.GetType();
190 this.axisTypeY =
Y.GetType();
196 this.painters.Add(Painter);
202 private void AddSegment(
IVector X,
IVector Y, ICollection<IElement> X2, ICollection<IElement> Y2,
208 if (this.axisTypeX is
null)
210 this.axisTypeX = X2V.GetType();
211 this.axisTypeY = Y2V.GetType();
213 else if (X2V.GetType() != this.axisTypeX || Y2V.GetType() != this.axisTypeY)
218 this.painters.Add(Painter);
243 set => this.minX = value;
252 set => this.maxX = value;
261 set => this.minY = value;
270 set => this.maxY = value;
284 set => this.title = value;
293 set => this.labelX = value;
302 set => this.labelY = value;
310 get => this.showXAxis;
311 set => this.showXAxis = value;
319 get => this.showYAxis;
320 set => this.showYAxis = value;
328 get => this.showGrid;
329 set => this.showGrid = value;
349 return this.
AddRight(Element,
false);
359 return Element.AddRightElementWise(
this);
386 if (!G.x.HasFirstItem)
395 axisTypeX = this.axisTypeX,
396 axisTypeY = this.axisTypeY,
398 labelX = this.labelX,
399 labelY = this.labelY,
405 Result.painters.AddRange(this.painters);
406 Result.parameters.
AddRange(this.parameters);
408 if (G.axisTypeX !=
this.axisTypeX || G.axisTypeY !=
this.axisTypeY)
417 ElementwiseAccumulatedAddition(ref Result.x, ref Result.y, G.x, G.y, ref Result.minX, ref Result.maxX, ref Result.minY, ref Result.maxY, G.minX, G.maxX);
419 ElementwiseAccumulatedAddition(ref Result.y, ref Result.x, G.y, G.x, ref Result.minY, ref Result.maxY, ref Result.minX, ref Result.maxX, G.minY, G.maxY);
438 Result.painters.AddRange(G.painters);
439 Result.parameters.
AddRange(G.parameters);
441 Result.showXAxis |= G.showXAxis;
442 Result.showYAxis |= G.showYAxis;
443 Result.elementwise = ElementWise;
452 Dictionary<string, IElement> Values =
new Dictionary<string, IElement>();
453 IEnumerator<IVector> vX = DestFixed.GetEnumerator();
454 IEnumerator<IVector> vY = DestValues.GetEnumerator();
455 IEnumerator<IElement> eX =
null;
456 IEnumerator<IElement> eY =
null;
463 while (vX.MoveNext() && vY.MoveNext())
474 while (eX.MoveNext() && eY.MoveNext())
484 while (vX.MoveNext() && vY.MoveNext())
496 while (eX.MoveNext() && eY.MoveNext())
499 Y2.
Add(Operators.Arithmetics.Add.EvaluateAddition(Value, eY.Current,
null));
505 DestValues.Add(
Y = (
IVector)
Y.Encapsulate(Y2,
null));
518 Dictionary<string, IElement> Sorted =
new Dictionary<string, IElement>();
522 vX = DestFixed.GetEnumerator();
525 vY = DestValues.GetEnumerator();
527 while (vX.MoveNext() && vY.MoveNext())
539 while (eX.MoveNext() && eY.MoveNext())
542 foreach (
string s
in Strings)
544 if (Sorted.TryGetValue(s, out
IElement E))
550 NormalizedX.
Add(Labels);
554 DestFixed = NormalizedX;
555 DestValues = NormalizedY;
573 this.minX.Equals(G.minX) &&
574 this.maxX.Equals(G.maxX) &&
575 this.minY.Equals(G.minY) &&
576 this.maxY.Equals(G.maxY) &&
577 this.axisTypeX.Equals(G.axisTypeX) &&
578 this.axisTypeY.Equals(G.axisTypeY) &&
579 this.title.Equals(G.title) &&
580 this.labelX.Equals(G.labelX) &&
581 this.labelY.Equals(G.labelY) &&
582 this.showXAxis.Equals(G.showXAxis) &&
583 this.showYAxis.Equals(G.showYAxis) &&
584 this.showGrid.Equals(G.showGrid) &&
585 this.Equals(
this.x.GetEnumerator(), G.x.GetEnumerator()) &&
586 this.Equals(
this.y.GetEnumerator(), G.y.GetEnumerator()) &&
587 this.Equals(
this.parameters.GetEnumerator(), G.parameters.GetEnumerator()) &&
588 this.Equals(
this.painters.GetEnumerator(), G.painters.GetEnumerator()));
591 private bool Equals(IEnumerator e1, IEnumerator e2)
595 bool b1 = e1.MoveNext();
596 bool b2 = e2.MoveNext();
600 if (!e1.Current.Equals(e2.Current))
611 if (e1 is IDisposable Disposable1)
612 Disposable1.Dispose();
614 if (e2 is IDisposable Disposable2)
615 Disposable2.Dispose();
622 int Result = this.minX.GetHashCode();
623 Result ^= Result << 5 ^ this.maxX.GetHashCode();
624 Result ^= Result << 5 ^ this.minY.GetHashCode();
625 Result ^= Result << 5 ^ this.maxY.GetHashCode();
626 Result ^= Result << 5 ^ this.axisTypeX.GetHashCode();
627 Result ^= Result << 5 ^ this.axisTypeY.GetHashCode();
628 Result ^= Result << 5 ^ this.title.GetHashCode();
629 Result ^= Result << 5 ^ this.labelX.GetHashCode();
630 Result ^= Result << 5 ^ this.labelY.GetHashCode();
631 Result ^= Result << 5 ^ this.showXAxis.GetHashCode();
632 Result ^= Result << 5 ^ this.showYAxis.GetHashCode();
633 Result ^= Result << 5 ^ this.showGrid.GetHashCode();
636 Result ^= Result << 5 ^ E.GetHashCode();
639 Result ^= Result << 5 ^ E.GetHashCode();
641 foreach (
object Obj
in this.parameters)
642 Result ^= Result << 5 ^ Obj.GetHashCode();
645 Result ^= Result << 5 ^ Painter.GetHashCode();
659 using (SKSurface Surface = SKSurface.Create(
new SKImageInfo(
Settings.
Width,
Settings.
Height, SKImageInfo.PlatformColorType, SKAlphaType.Premul)))
661 SKCanvas Canvas = Surface.Canvas;
663 States = Array.Empty<
object>();
667 int x1, y1, x2, y2, x3, y3, w, h;
668 bool DrawText = Settings.LabelFontSize > 0;
675 if (DrawText && !
string.IsNullOrEmpty(this.labelY))
676 x1 += (
int)(Settings.LabelFontSize * 2 + 0.5);
678 if (DrawText && !
string.IsNullOrEmpty(this.labelX))
679 y2 -= (
int)(Settings.LabelFontSize * 2 + 0.5);
681 if (DrawText && !
string.IsNullOrEmpty(this.title))
682 y1 += (
int)(Settings.LabelFontSize * 2 + 0.5);
685 string[] YLabelStrings =
LabelStrings(YLabels, YLabelType);
686 SKPaint Pen =
new SKPaint()
689 Style = SKPaintStyle.Fill,
690 Color = Settings.AxisColor
692 SKFont NormalFont = DrawText ?
new SKFont()
694 Edging = SKFontEdging.SubpixelAntialias,
695 Hinting = SKFontHinting.Full,
698 ?? SKTypeface.Default,
701 SKFont LargeFont = DrawText ?
new SKFont()
703 Edging = SKFontEdging.SubpixelAntialias,
704 Hinting = SKFontHinting.Full,
707 ?? SKTypeface.Default,
710 SKRect Bounds =
new SKRect();
714 if (DrawText && this.showYAxis)
718 NormalFont.MeasureText(
LabelString(Label, YLabelType), out Bounds, Pen);
728 string[] XLabelStrings =
LabelStrings(XLabels, XLabelType);
731 if (DrawText && this.showXAxis)
735 NormalFont.MeasureText(
LabelString(Label, XLabelType), out Bounds, Pen);
736 Size = Bounds.Height;
746 SKPaint AxisBrush =
new SKPaint()
749 Style = SKPaintStyle.Fill,
750 Color = Settings.AxisColor
752 SKPaint GridBrush =
new SKPaint()
755 Style = SKPaintStyle.Fill,
756 Color = Settings.GridColor
758 SKPaint AxisPen =
new SKPaint()
761 Style = SKPaintStyle.Stroke,
763 StrokeWidth = Settings.AxisWidth
765 SKPaint GridPen =
new SKPaint()
768 Style = SKPaintStyle.Stroke,
770 StrokeWidth = Settings.GridWidth
774 this.minX.AssociatedObjectValue is
double MinX &&
781 double SX = w / (DX == 0 ? 1 : DX);
782 double SY = h / (DY == 0 ? 1 : DY);
786 int h2 = (int)(h * SX / SY + 0.5);
792 int w2 = (int)(w * SY / SX + 0.5);
802 OrigoX =
Scale(
new ObjectVector(AgX.AdditiveIdentity),
this.minX,
this.maxX, x3, w,
null)[0];
807 OrigoY =
Scale(
new ObjectVector(AgY.AdditiveIdentity),
this.minY,
this.maxY, y3, -h,
null)[0];
811 DrawingArea DrawingArea =
new DrawingArea(this.minX, this.maxX, this.minY, this.maxY, x3, y3, w, -h, (
float)OrigoX, (
float)OrigoY, this.elementwise);
813 Dictionary<string, double> YLabelPositions = YLabelType == LabelType.String ?
new Dictionary<string, double>() :
null;
821 s = YLabelStrings[i];
824 NormalFont.MeasureText(s, out Bounds, Pen);
829 if (!(YLabelPositions is
null))
830 YLabelPositions[s] = d;
835 Canvas.DrawLine(x3, f, x2, f, AxisPen);
837 Canvas.DrawLine(x3, f, x2, f, GridPen);
840 if (DrawText && this.showYAxis)
842 f += Bounds.Height * 0.5f;
844 SKTextAlign.Left, NormalFont, Pen);
849 Dictionary<string, double> XLabelPositions = XLabelType == LabelType.String ?
new Dictionary<string, double>() :
null;
854 s = XLabelStrings[i];
857 NormalFont.MeasureText(s, out Bounds, Pen);
862 if (!(XLabelPositions is
null))
863 XLabelPositions[s] = d;
868 Canvas.DrawLine(f, y1, f, y3, AxisPen);
870 Canvas.DrawLine(f, y1, f, y3, GridPen);
873 if (DrawText && this.showXAxis)
879 else if (f + Size > x3 + w)
882 Canvas.DrawText(s, f,
884 SKTextAlign.Left, NormalFont, Pen);
888 DrawingArea.XLabelPositions = XLabelPositions;
889 DrawingArea.YLabelPositions = YLabelPositions;
891 if (DrawText && !
string.IsNullOrEmpty(this.title))
893 LargeFont.MeasureText(this.title, out Bounds, Pen);
896 f = x3 + (x2 - x3 - Size) * 0.5f;
900 else if (f + Size > x3 + w)
903 Canvas.DrawText(this.title, f, (
float)(Settings.MarginTop + 0.1 * Settings.LabelFontSize - Bounds.Top),
904 SKTextAlign.Left, LargeFont, Pen);
907 if (DrawText && !
string.IsNullOrEmpty(this.labelX))
909 LargeFont.MeasureText(this.labelX, out Bounds, Pen);
912 f = x3 + (x2 - x3 - Size) * 0.5f;
916 else if (f + Size > x3 + w)
919 Canvas.DrawText(this.labelX, f,
920 (
float)(Settings.Height - Settings.MarginBottom - 0.1 * Settings.LabelFontSize - Bounds.Height - Bounds.Top),
921 SKTextAlign.Left, LargeFont, Pen);
924 if (DrawText && !
string.IsNullOrEmpty(this.labelY))
926 LargeFont.MeasureText(this.labelY, out Bounds, Pen);
929 f = y3 - (y3 - y1 - Size) * 0.5f;
936 Canvas.Translate((
float)(Settings.MarginLeft + 0.1 * Settings.LabelFontSize - Bounds.Top), f);
937 Canvas.RotateDegrees(-90);
938 Canvas.DrawText(this.labelY, 0, 0, SKTextAlign.Left, LargeFont, Pen);
939 Canvas.ResetMatrix();
944 IEnumerator<object[]> eParameters = this.parameters.GetEnumerator();
945 IEnumerator<IPainter2D> ePainters = this.painters.GetEnumerator();
947 SKPoint[] PrevPoints =
null;
948 object[] PrevParameters =
null;
953 while (ex.MoveNext() && ey.MoveNext() && eParameters.MoveNext() && ePainters.MoveNext())
957 if (!(PrevPainter is
null) && ePainters.Current.GetType() == PrevPainter.GetType())
958 ePainters.Current.DrawGraph(Canvas, Points, eParameters.Current, PrevPoints, PrevParameters,
DrawingArea);
960 ePainters.Current.DrawGraph(Canvas, Points, eParameters.Current,
null,
null,
DrawingArea);
963 PrevParameters = eParameters.Current;
964 PrevPainter = ePainters.Current;
967 using (SKImage Result = Surface.Snapshot())
969 NormalFont?.Dispose();
970 LargeFont?.Dispose();
987 eParameters.Dispose();
1007 return "[" + X2.ToString() +
"," + Y2.ToString() +
"]";
1016 Output.WriteStartElement(
"Graph2D");
1017 Output.WriteAttributeString(
"title", this.title);
1018 Output.WriteAttributeString(
"labelX", this.labelX);
1019 Output.WriteAttributeString(
"labelY", this.labelY);
1020 Output.WriteAttributeString(
"axisTypeX", this.axisTypeX?.FullName);
1021 Output.WriteAttributeString(
"axisTypeY", this.axisTypeY?.FullName);
1026 Output.WriteAttributeString(
"showXAxis", this.showXAxis ?
"true" :
"false");
1027 Output.WriteAttributeString(
"showYAxis", this.showYAxis ?
"true" :
"false");
1028 Output.WriteAttributeString(
"showGrid", this.showGrid ?
"true" :
"false");
1030 Dictionary<string, string> Series =
new Dictionary<string, string>();
1038 if (Series.TryGetValue(s, out Label))
1039 Output.WriteElementString(
"X", Label);
1042 Label =
"X" + (i++).ToString();
1044 Output.WriteElementString(
"X", Label +
":=" + s);
1053 if (Series.TryGetValue(s, out Label))
1054 Output.WriteElementString(
"Y", Label);
1057 Label =
"Y" + (i++).ToString();
1059 Output.WriteElementString(
"Y", Label +
":=" + s);
1065 foreach (
object[] v
in this.parameters)
1068 if (Series.TryGetValue(s, out Label))
1069 Output.WriteElementString(
"Parameters", Label);
1072 Label =
"P" + (i++).ToString();
1074 Output.WriteElementString(
"Parameters", Label +
":=" + s);
1078 foreach (
IPainter2D Painter
in this.painters)
1079 Output.WriteElementString(
"Painter", Painter.GetType().FullName);
1081 Output.WriteEndElement();
1092 return ((
float)Value).ToString(CultureInfo.InvariantCulture);
1103 StringBuilder sb =
null;
1105 foreach (
double d
in Value.Values)
1108 sb =
new StringBuilder(
"[");
1112 sb.Append(((
float)d).ToString(CultureInfo.InvariantCulture));
1120 return sb.ToString();
1132 StringBuilder sb =
null;
1134 foreach (DateTime d
in Value.Values)
1137 sb =
new StringBuilder(
"DateTime([");
1142 int Month = d.Month;
1145 int Minute = d.Minute;
1146 int Second = d.Second;
1147 int MSecond = d.Millisecond;
1169 sb.Append(Year.ToString());
1175 sb.Append(Month.ToString());
1181 sb.Append(Day.ToString());
1187 sb.Append(Hour.ToString());
1193 sb.Append(Minute.ToString());
1199 sb.Append(Second.ToString());
1205 sb.Append(MSecond.ToString());
1213 if (d.Kind == DateTimeKind.Utc)
1224 return sb.ToString();
1236 StringBuilder sb =
null;
1238 foreach (
IElement E
in Value.Values)
1244 sb =
new StringBuilder(
"TimeSpan([");
1249 int Hours = TS.Hours;
1250 int Minutes = TS.Minutes;
1251 int Seconds = TS.Seconds;
1252 int MSeconds = TS.Milliseconds;
1269 if (Days != 0 || Mask == 0)
1270 sb.Append(Days.ToString());
1279 sb.Append(Hours.ToString());
1285 sb.Append(Minutes.ToString());
1291 sb.Append(Seconds.ToString());
1297 sb.Append(MSeconds.ToString());
1311 return sb.ToString();
1329 else if (Value is
ObjectVector ov && IsTimeSpanVector(ov))
1354 foreach (XmlAttribute Attr
in Xml.Attributes)
1359 this.title = Attr.Value;
1363 this.labelX = Attr.Value;
1367 this.labelY = Attr.Value;
1395 this.showXAxis = Attr.Value ==
"true";
1399 this.showYAxis = Attr.Value ==
"true";
1403 this.showGrid = Attr.Value ==
"true";
1408 foreach (XmlNode N
in Xml.ChildNodes)
1410 if (N is XmlElement E)
1412 switch (E.LocalName)
1442 IEnumerator<object[]> eParameters = this.parameters.GetEnumerator();
1443 IEnumerator<IPainter2D> ePainter = this.painters.GetEnumerator();
1447 while (eParameters.MoveNext() && ePainter.MoveNext())
1449 if (!ePainter.Current.UsesDefaultColor(eParameters.Current))
1457 eParameters.Dispose();
1473 IEnumerator<object[]> eParameters = this.parameters.GetEnumerator();
1474 IEnumerator<IPainter2D> ePainter = this.painters.GetEnumerator();
1479 while (eParameters.MoveNext() && ePainter.MoveNext())
1481 if (!ePainter.Current.TrySetDefaultColor(Color, eParameters.Current))
1489 eParameters.Dispose();
A chunked list is a linked list of chunks of objects of type T .
IEnumerator< T > GetEnumerator()
Returns an enumerator for the collection.
void AddRange(IEnumerable< T > Collection)
Adds a range of elements (last) to the list.
bool HasFirstItem
If there is a first item in the collection
void Add(T Item)
Adds an item to the collection.
Static class that dynamically manages types and interfaces available in the runtime environment.
static Type GetType(string FullName)
Gets a type, given its full name.
static object Instantiate(Type Type, params object[] Arguments)
Returns an instance of the type Type . If one needs to be created, it is. If the constructor requires...
Base class for all types of elements.
Element()
Base class for all types of elements.
virtual ICollection< IElement > VectorElements
An enumeration of vector elements.
Base class for all types of groups.
Base class for script exceptions.
Class managing a script expression.
static string ToExpressionString(object Value)
Converts an object to a string, that can be parsed as part of an expression.
static double CalcMax(double[] Values, ScriptNode Node)
Returns the largest value.
static double CalcMin(double[] Values, ScriptNode Node)
Returns the smallest value.
Contains information about the current drawing area.
IElement DescaleY(double Value)
Descales a scaled value along the Y-axis.
SKPoint[] Scale(IVector VectorX, IVector VectorY)
Scales two vectors of equal size to points in a rectangular area.
IElement DescaleX(double Value)
Descales a scaled value along the X-axis.
double[] ScaleX(IVector Vector)
Scales a vector to fit a given area.
double[] ScaleY(IVector Vector)
Scales a vector to fit a given area.
Handles two-dimensional graphs.
override ISemiGroupElementWise AddRightElementWise(ISemiGroupElementWise Element)
Tries to add an element to the current element, from the right, element-wise.
IElement MinX
Smallest X-value.
static string ReducedXmlString(double Value)
Generates an XML value string of an element, possible with reduced resolution, to avoid unnecessary d...
ISemiGroupElement AddRight(ISemiGroupElement Element, bool ElementWise)
Tries to add an element to the current element, from the right.
string Title
Title for graph.
bool ShowXAxis
If the X-axis is to be displayed.
override void ExportGraph(XmlWriter Output)
Exports graph specifics to XML.
Graph2D()
Base class for two-dimensional graphs.
bool ShowYAxis
If the Y-axis is to be displayed.
override ISemiGroupElement AddLeft(ISemiGroupElement Element)
Tries to add an element to the current element, from the left.
static string ReducedXmlStringTimeSpans(ObjectVector Value)
Generates an XML value string of an element, possible with reduced resolution, to avoid unnecessary d...
IElement MinY
Smallest Y-value.
override bool Equals(object obj)
Compares the element to another. If elements are equal.
override bool UsesDefaultColor
If graph uses default color
IElement MaxX
Largest X-value.
override ISemiGroupElementWise AddLeftElementWise(ISemiGroupElementWise Element)
Tries to add an element to the current element, from the left, element-wise.
static string ReducedXmlString(DateTimeVector Value)
Generates an XML value string of an element, possible with reduced resolution, to avoid unnecessary d...
static string ReducedXmlString(DoubleVector Value)
Generates an XML value string of an element, possible with reduced resolution, to avoid unnecessary d...
override PixelInformation CreatePixels(GraphSettings Settings, out object[] States)
Creates a bitmap of the graph.
override string GetBitmapClickScript(double X, double Y, object[] States)
Gets script corresponding to a point in a generated bitmap representation of the graph.
ChunkedList< IVector > X
X-axis series.
string LabelY
Label for y-axis.
override bool TrySetDefaultColor(SKColor Color)
Tries to set the default color.
Graph2D(Variables Variables, IVector X, IVector Y, IPainter2D Painter, bool ShowZeroX, bool ShowZeroY, ScriptNode Node, params object[] Parameters)
Base class for two-dimensional graphs.
ChunkedList< object[]> Parameters
Parameters.
IElement MaxY
Largest Y-value.
override int GetHashCode()
Calculates a hash code of the element. Hash code.
override ISemiGroupElement AddRight(ISemiGroupElement Element)
Tries to add an element to the current element, from the right.
Graph2D(Variables Variables, int? DefaultWidth, int? DefaultHeight)
Base class for two-dimensional graphs.
ChunkedList< IVector > Y
Y-axis series.
Graph2D(GraphSettings Settings)
Base class for two-dimensional graphs.
Graph2D(Variables Variables)
Base class for two-dimensional graphs.
override async Task ImportGraphAsync(XmlElement Xml)
Imports graph specifics from XML.
static string ReducedXmlString(IElement Value)
Generates an XML value string of an element, possible with reduced resolution, to avoid unnecessary d...
bool Elementwise
If graph was generated using element-wise addition operations.
bool ShowGrid
If the grid is to be displayed.
string LabelX
Label for x-axis.
bool SameScale
If the same scale should be used for all axes.
object[] ToObjectArray(IVector v)
Gets an array of objects corresponding to the elements of a vector.
static string[] LabelStrings(IVector Labels, LabelType LabelType)
Converts a vector of labels to a string array.
static IVector GetLabels(ref IElement Min, ref IElement Max, IEnumerable< IVector > Series, int ApproxNrLabels, out LabelType LabelType)
Gets label values for a series vector.
static SKPoint[] Scale(IVector VectorX, IVector VectorY, IElement MinX, IElement MaxX, IElement MinY, IElement MaxY, double OffsetX, double OffsetY, double Width, double Height, Dictionary< string, double > XLabelPositions, Dictionary< string, double > YLabelPositions)
Scales two vectors of equal size to points in a rectangular area.
GraphSettings Settings
Graph settings available during creation.
static string LabelString(IElement Label, LabelType LabelType)
Converts a label to a string.
static async Task< IElement > ParseAsync(string s, Variables Variables)
Parses an element expression string.
SKColor AxisColor
Axis color.
SKColor BackgroundColor
Background color.
int ApproxNrLabelsY
Approximate number of labels along the Y-axis.
int MarginLabel
Label margin.
int MarginRight
Right margin.
int ApproxNrLabelsX
Approximate number of labels along the X-axis.
int MarginLeft
Left margin.
int MarginBottom
Bottom margin.
double LabelFontSize
Label font size
SKColor GridColor
Grid color.
int Width
Width of graph, in pixels. (Default=640 pixels.)
int Height
Height of graph, in pixels. (Default=480 pixels.)
string FontName
Font name.
Base class for all nodes in a parsed script tree.
override string ToString()
static readonly DoubleNumber ZeroElement
0
static IElement Encapsulate(Array Elements, bool CanEncapsulateAsMatrix, ScriptNode Node)
Encapsulates the elements of a vector.
Basic interface for all types of elements.
object AssociatedObjectValue
Associated object value.
ICollection< IElement > ChildElements
An enumeration of child elements. If the element is a scalar, this property will return null.
ISet AssociatedSet
Associated Set.
Basic interface for all types of semigroup elements.
Basic interface for all types of element-wise semigroup elements.
Basic interface for vectors.
Basic interface for all types of abelian groups.
Interface for 2D graph drawing functions.