/// <summary> /// Measure axis ruler information. /// </summary> /// <param name="info">Specified axis data information set.</param> /// <param name="data">Data to be measured.</param> protected virtual void MeasureAxisRuler(AxisDataInfo info, double data) { if (info.Minimum > data) { info.Minimum = data; } if (info.Maximum < data) { info.Maximum = data; } info.LargeStride = (info.Maximum - info.Minimum) / 5; }
/// <summary> /// Update specified axis information. /// </summary> /// <param name="ai">Axis information set.</param> /// <param name="minData">Minimum value scanned from data range.</param> /// <param name="maxData">Maximum value scanned from data range.</param> protected virtual void UpdateAxisInfo(AxisDataInfo ai, double minData, double maxData) { var clientRect = this.PlotViewContainer; double range = maxData - minData; var isTransposed = HorizontalAxisInfoView.Orientation == AxisOrientation.Vertical; ai.Levels = (int)Math.Ceiling((isTransposed ? clientRect.Width : clientRect.Height) / 30f); // when clientRect is zero, nothing to do if (double.IsNaN(ai.Levels)) { return; } if (minData == maxData) { if (maxData == 0) { maxData = ai.Levels; } else { minData = 0; } } int scaler; double stride = ChartUtility.CalcLevelStride(minData, maxData, ai.Levels, out scaler); double nearzero = stride / 1E9; ai.Scaler = scaler; double m; if (!ai.AutoMinimum) { if (this.AxisOriginToZero(minData, maxData, range)) { ai.Minimum = 0; } else { m = minData % stride; if (Math.Abs(m) < nearzero) { ai.Minimum = minData; } else { if (minData < 0) { ai.Minimum = minData - stride - m; } else { ai.Minimum = minData - m; } } } } if (!ai.AutoMaximum) { m = maxData % stride; if (Math.Abs(m) < nearzero) { ai.Maximum = maxData; } else { ai.Maximum = maxData - m + stride; } } ai.Levels = (int)Math.Round((ai.Maximum - ai.Minimum) / stride); ai.LargeStride = stride; }
/// <summary> /// Update specified axis information. /// </summary> /// <param name="ai">Axis information set.</param> /// <param name="minData">Minimum value scanned from data range.</param> /// <param name="maxData">Maximum value scanned from data range.</param> protected virtual void UpdateAxisInfo(AxisDataInfo ai, double minData, double maxData) { var clientRect = this.PlotViewContainer; double range = maxData - minData; ai.Levels = (int)Math.Ceiling(clientRect.Height / 30f); // when clientRect is zero, nothing to do if (double.IsNaN(ai.Levels)) { return; } if (minData == maxData) { if (maxData == 0) { maxData = ai.Levels; } else { minData = 0; } } int scaler; double stride = ChartUtility.CalcLevelStride(minData, maxData, ai.Levels, out scaler); ai.Scaler = scaler; double m; if (!ai.AutoMinimum) { if (this.AxisOriginToZero(minData, maxData, range)) { ai.Minimum = 0; } else { m = minData % stride; if (m == 0) { if (minData == 0) { ai.Minimum = minData; } else { ai.Minimum = minData - stride; } } else { if (minData < 0) { ai.Minimum = minData - stride - m; } else { ai.Minimum = minData - m; } } } } if (!ai.AutoMaximum) { m = maxData % stride; if (m == 0) { ai.Maximum = maxData + stride; } else { ai.Maximum = maxData - m + stride; } } ai.Levels = (int)Math.Round((ai.Maximum - ai.Minimum) / stride); ai.LargeStride = stride; }
/// <summary> /// Create scatter chart component instance. /// </summary> public ScatterChart() { SecondaryAxisInfo = new AxisDataInfo(); AddPlotViewLayer(ScatterChartPlotView = new ScatterChartPlotView(this)); }