Example #1
0
        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);
        }
Example #2
0
        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);
        }