/// <summary> /// Checks whether intersection region of two ranges is not empty. /// </summary> /// <param name="range">the DoubleRange</param> /// <returns><b>true</b> if intersection is not empty</returns> public bool Intersects(DoubleRange range) { if (this.IsEmpty || this.IsEmpty) { return(false); } return(this.Inside(range.m_start) || this.Inside(range.m_end) || range.Inside(this.m_start) || range.Inside(this.m_end)); }
internal double CalculateValueToCoefficient(double value) { double result = 0; double length; double spacing = 5; DoubleRange visibleActualRange = DoubleRange.Empty; length = this.Orientation == Orientation.Horizontal ? AvailableSize.Width : AvailableSize.Height; foreach (var range in AxisRanges) { visibleActualRange += range; } for (int i = 0; i < AxisRanges.Count; i++) { if (BreakRanges != null && i < BreakRanges.Count) { spacing = this.BreakRangesInfo[BreakRanges[i]].BreakSpacing; } if (visibleActualRange.Inside(value)) { if (AxisRanges[i].Inside(value)) { var start = AxisRanges[i].Start; var delta = AxisRanges[i].Delta; result += (AxisLength[i] / length) * (value - start) / delta; break; } if (BreakRanges != null && i < BreakRanges.Count && value > BreakRanges[i].Start && value < BreakRanges[i].End) { result += ((AxisLength[i]) / length); result += (((value - BreakRanges[i].Start)) / BreakRanges[i].Delta) * (spacing / length); break; } result += ((AxisLength[i] + spacing) / length); } else { result = (value - visibleActualRange.Start) / visibleActualRange.Delta; } } return(result); }
private double CalculateCoefficientToValue(double value) { double length; double result = double.NaN; double coeffValue = 0; double spacing = 5; length = this.Orientation == Orientation.Horizontal ? AvailableSize.Width : AvailableSize.Height; for (int i = 0; i < AxisRanges.Count; i++) { var brkCoeff = DoubleRange.Empty; if (BreakRanges != null && i < BreakRanges.Count) { spacing = this.BreakRangesInfo[BreakRanges[i]].BreakSpacing; brkCoeff = new DoubleRange(ValueToCoefficient(BreakRanges[i].Start), ValueToCoefficient(BreakRanges[i].End)); } var coeffRange = new DoubleRange(ValueToCoefficient(AxisRanges[i].Start), ValueToCoefficient(AxisRanges[i].End)); if (coeffRange.Inside(value)) { result = AxisRanges[i].Start + (AxisRanges[i].Delta * ((value - coeffValue) / (AxisLength[i] / length))); break; } if (value > 1) { result = AxisRanges[AxisRanges.Count - 1].Start + (AxisRanges[AxisRanges.Count - 1].Delta * ((value - coeffValue) / (AxisLength.Last() / length))); break; } if (value < 0) { result = AxisRanges[0].Start + (AxisRanges[0].Delta * ((value - coeffValue) / (AxisLength.First() / length))); break; } if (i < BreakRanges.Count && value > brkCoeff.Start && value < brkCoeff.End) { result = BreakRanges[i].Start + (BreakRanges[i].Delta * ((value - coeffValue) / BreakRangesInfo[BreakRanges[i]].BreakSpacing / length)); break; } coeffValue += ((AxisLength[i] + spacing) / length); } return(result); }
/// <summary> /// Method implementation for Generate Labels in ChartAxis /// </summary> /// <param name="axis">The axis.</param> /// <param name="smallTicksPerInterval">The small ticks per interval.</param> internal static void GenerateVisibleLabels(ChartAxisBase2D axis, object minimum, object maximum, object actualInterval, double smallTicksPerInterval) { DoubleRange range = axis.VisibleRange; double interval = axis.VisibleInterval; double position; if ((minimum != null && maximum != null && actualInterval != null) || axis.DesiredIntervalsCount != null || axis.EdgeLabelsVisibilityMode == EdgeLabelsVisibilityMode.AlwaysVisible || (axis.EdgeLabelsVisibilityMode == EdgeLabelsVisibilityMode.Visible && !axis.IsZoomed)) { position = range.Start; } else { position = range.Start - (range.Start % interval); } double previousPosition = double.NaN; for (; position <= range.End; position += interval) { if (position == previousPosition) { break; } if (range.Inside(position)) { axis.VisibleLabels.Add(new ChartAxisLabel(position, (axis as ChartAxis).GetActualLabelContent(position), position)); } if (axis.smallTicksRequired) { axis.AddSmallTicksPoint(position); } previousPosition = position; } if (((maximum != null && range.End.Equals(maximum)) || axis.EdgeLabelsVisibilityMode == EdgeLabelsVisibilityMode.AlwaysVisible || (axis.EdgeLabelsVisibilityMode == EdgeLabelsVisibilityMode.Visible && !axis.IsZoomed)) && !range.End.Equals(position - interval)) { axis.VisibleLabels.Add(new ChartAxisLabel(range.End, (axis as ChartAxis).GetActualLabelContent(range.End), range.End)); } }
private void ComputeBreakRange(DoubleRange currentRange, int index) { bool canAdd = true; for (int i = 0; i < this.BreakRanges.Count;) { DoubleRange previous = this.BreakRanges[i]; if (currentRange.Inside(previous)) { BreakRangesInfo.Remove(BreakRanges[i]); this.BreakRanges.RemoveAt(i); } else if (previous.Inside(currentRange)) { canAdd = false; break; } else if (previous.Intersects(currentRange)) { currentRange += previous; BreakRangesInfo.Remove(BreakRanges[i]); this.BreakRanges.RemoveAt(i); } else { i++; } } if (!canAdd) { return; } if (currentRange.Delta == 0) { return; } this.BreakRanges.Add(currentRange); BreakRangesInfo.Add(currentRange, AxisScaleBreaks[index]); }