public static bool EqualEps(Range <double> first, Range <double> second, double eps) { double delta = Math.Min(first.GetLength(), second.GetLength()); return(Math.Abs(first.Min - second.Min) < eps * delta && Math.Abs(first.Max - second.Max) < eps * delta); }
internal void UpdateUI() { if (range.IsEmpty) { return; } if (transform == null) { return; } if (independent) { InitTransform(RenderSize); } bool isHorizontal = Placement == AxisPlacement.Bottom || Placement == AxisPlacement.Top; if (transform.ScreenRect.Width == 0 && isHorizontal || transform.ScreenRect.Height == 0 && !isHorizontal) { return; } if (!IsMeasureValid) { InvalidateMeasure(); } Range <double> currentDoubleRange = new Range <double>(convertToDouble(range.Min), convertToDouble(range.Max)); bool sameLength = Math.Abs(cachedPartLength - currentDoubleRange.GetLength()) / cachedPartLength < 0.01 || cachedPartLength == 0; if (UseSmoothPanning && sameLength) { Debug.WriteLine(Placement + " " + range + " " + axisLongRange); // current range is included into axisLongRange if (currentDoubleRange < axisLongRange) { var axisContent = (FrameworkElement)mainGrid.Children[0]; double leftScreen; if (placement.IsBottomOrTop()) { leftScreen = ((axisLongRange.Min - currentDoubleRange.Min) / currentDoubleRange.GetLength() + 1) * getSize(transform.ScreenRect.Size); } else { leftScreen = -((axisLongRange.Min - currentDoubleRange.Min) / currentDoubleRange.GetLength() + 1) * getSize(transform.ScreenRect.Size); } StackCanvas.SetCoordinate(axisContent, leftScreen); // this call should be commented // double rightScreen = ((axisLongRange.Max - currentDoubleRange.Max) / currentDoubleRange.GetLength() + 1) * getSize(transform.ScreenRect.Size); // StackCanvas.SetEndCoordinate(axisContent, rightScreen); } else { double length = currentDoubleRange.GetLength(); cachedPartLength = length; // cached axis part is three times longer double min = currentDoubleRange.Min - length; double max = currentDoubleRange.Max + length; Range <T> widerRange = new Range <T>(convertFromDouble(min), convertFromDouble(max)); axisLongRange = new Range <double>(min, max); // rebuild entire ticks FillParts(widerRange); Debug.WriteLine("не шире " + Placement + " " + widerRange); originalScreenTicks = screenTicks.ToArray(); } // updating screen ticks (for axis grid) // 3 is a ratio of cached area to visible area double shift = (currentDoubleRange.Min - (axisLongRange.Min + axisLongRange.GetLength() / 3)) * getSize(transform.ScreenRect.Size); if (!placement.IsBottomOrTop()) { shift *= -1; } screenTicks = originalScreenTicks.ToArray(); for (int i = 0; i < originalScreenTicks.Length; i++) { screenTicks[i] -= shift; } } else { FillParts(range); } ScreenTicksChanged.Raise(this); }