public ITicksInfo <T> GetTicks(Range <T> range, int ticksCount) { Verify.IsTrue(ticksCount > 0); T start = range.Min; T end = range.Max; TimeSpan length = GetDifference(start, end); diff = strategy.GetDifference(length); TicksInfo <T> result = new TicksInfo <T> { Info = diff }; if (providers.ContainsKey(diff)) { ITicksInfo <T> innerResult = providers[diff].GetTicks(range, ticksCount); T[] ticks = ModifyTicksGuard(innerResult.Ticks, diff); result.Ticks = ticks; this.result = result; return(result); } throw new InvalidOperationException(Strings.Exceptions.UnsupportedRangeInAxis); }
public ITicksInfo <T> GetTicks(Range <T> range, int ticksCount) { T start = range.Min; T end = range.Max; DifferenceIn diff = Difference; start = RoundDown(start, end); end = RoundUp(start, end); RoundingInfo bounds = RoundingHelper.CreateRoundedRange( GetSpecificValue(start, start), GetSpecificValue(start, end)); int delta = (int)(bounds.Max - bounds.Min); if (delta == 0) { return new TicksInfo <T> { Ticks = new T[] { start } } } ; int step = delta / ticksCount; if (step == 0) { step = 1; } T tick = GetStart(start, (int)bounds.Min, step); bool isMinDateTime = IsMinDate(tick) && step != 1; if (isMinDateTime) { step--; } List <T> ticks = new List <T>(); T finishTick = AddStep(range.Max, step); while (Continue(tick, finishTick)) { ticks.Add(tick); tick = AddStep(tick, step); if (isMinDateTime) { isMinDateTime = false; step++; } } ticks = Trim(ticks, range); TicksInfo <T> res = new TicksInfo <T> { Ticks = ticks.ToArray(), Info = diff }; return(res); }
public ITicksInfo <double> GetTicks(Range <double> range, int ticksCount) { double start = range.Min; double finish = range.Max; double delta = finish - start; int log = (int)Math.Round(Math.Log10(delta)); double newStart = RoundingHelper.Round(start, log); double newFinish = RoundingHelper.Round(finish, log); if (newStart == newFinish) { log--; newStart = RoundingHelper.Round(start, log); newFinish = RoundingHelper.Round(finish, log); } // calculating step between ticks double unroundedStep = (newFinish - newStart) / ticksCount; int stepLog = log; // trying to round step double step = RoundingHelper.Round(unroundedStep, stepLog); if (step == 0) { stepLog--; step = RoundingHelper.Round(unroundedStep, stepLog); if (step == 0) { // step will not be rounded if attempts to be rounded to zero. step = unroundedStep; } } if (step < minStep) { step = minStep; } if (step != 0.0) { ticks = CreateTicks(start, finish, step); } else { ticks = new double[] { }; } TicksInfo <double> res = new TicksInfo <double> { Info = log, Ticks = ticks }; return(res); }
public ITicksInfo <double> GetTicks(Range <double> range, int ticksCount) { if (Coeffs.Length == 0) { return(new TicksInfo <double>()); } var minorTicks = ranges.Select(r => CreateTicks(r)).SelectMany(m => m); var res = new TicksInfo <double>(); res.TickSizes = minorTicks.Select(m => m.Value).ToArray(); res.Ticks = minorTicks.Select(m => m.Tick).ToArray(); return(res); }
public ITicksInfo <T> GetTicks(Range <T> range, int ticksCount) { if (majorTicks.Length == 0) { return(new TicksInfo <T>()); } ticksCount /= majorTicks.Length; if (ticksCount == 0) { ticksCount = 2; } var ticks = majorTicks.GetPairs().Select(r => Clip(provider.GetTicks(r, ticksCount), r)). SelectMany(t => t.Ticks).ToArray(); var res = new TicksInfo <T> { Ticks = ticks, TickSizes = ArrayExtensions.CreateArray(ticks.Length, ticksSize) }; return(res); }
private void DoDrawMajorLabels() { ITicksProvider <T> majorTicksProvider = ticksProvider.MajorProvider; additionalLabelsCanvas.Children.Clear(); if (majorTicksProvider != null && majorLabelProvider != null) { additionalLabelsCanvas.Visibility = Visibility.Visible; Size renderSize = RenderSize; var majorTicks = majorTicksProvider.GetTicks(range, DefaultTicksProvider.DefaultTicksCount); double[] screenCoords = majorTicks.Ticks.Select(tick => createDataPoint(convertToDouble(tick))). Select(p => p.DataToScreen(transform)).Select(p => getCoordinate(p)).ToArray(); // todo this is not the best decision - when displaying, for example, // milliseconds, it causes to create hundreds and thousands of textBlocks. double rangesRatio = GetRangesRatio(majorTicks.Ticks.GetPairs().ToArray()[0], range); object info = majorTicks.Info; MajorLabelsInfo newInfo = new MajorLabelsInfo { Info = info, MajorLabelsCount = (int)Math.Ceiling(rangesRatio) }; var newMajorTicks = new TicksInfo <T> { Info = newInfo, Ticks = majorTicks.Ticks, TickSizes = majorTicks.TickSizes }; UIElement[] additionalLabels = MajorLabelProvider.CreateLabels(newMajorTicks); for (int i = 0; i < additionalLabels.Length; i++) { if (screenCoords[i].IsNaN()) { continue; } UIElement tickLabel = additionalLabels[i]; tickLabel.Measure(renderSize); StackCanvas.SetCoordinate(tickLabel, screenCoords[i]); StackCanvas.SetEndCoordinate(tickLabel, screenCoords[i + 1]); if (tickLabel is FrameworkElement) { ((FrameworkElement)tickLabel).LayoutTransform = additionalLabelTransform; } additionalLabelsCanvas.Children.Add(tickLabel); } } else { additionalLabelsCanvas.Visibility = Visibility.Collapsed; } }