PageRenderTime 41ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/Main/src/DynamicDataDisplay/Charts/Isolines/AdditionalLinesDisplay.cs

#
C# | 88 lines | 72 code | 15 blank | 1 comment | 10 complexity | 97b67b0d8b1600c4660275144a69fbf7 MD5 | raw file
Possible License(s): CC-BY-SA-3.0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Windows.Media;
  6. using System.Windows;
  7. using Microsoft.Research.DynamicDataDisplay.Common.Auxiliary;
  8. using Microsoft.Research.DynamicDataDisplay.Charts.NewLine;
  9. namespace Microsoft.Research.DynamicDataDisplay.Charts.Isolines
  10. {
  11. public sealed class AdditionalLinesDisplay : IsolineGraphBase
  12. {
  13. protected override void OnPlotterAttached()
  14. {
  15. base.OnPlotterAttached();
  16. Plotter2D.Viewport.PropertyChanged += Viewport_PropertyChanged;
  17. }
  18. protected override void OnPlotterDetaching()
  19. {
  20. Plotter2D.Viewport.PropertyChanged -= Viewport_PropertyChanged;
  21. base.OnPlotterDetaching();
  22. }
  23. void Viewport_PropertyChanged(object sender, ExtendedPropertyChangedEventArgs e)
  24. {
  25. InvalidateVisual();
  26. }
  27. protected override void OnRender(DrawingContext drawingContext)
  28. {
  29. if (Plotter2D == null) return;
  30. if (DataSource == null) return;
  31. if (Collection == null) return;
  32. if (Collection.Lines.Count == 0)
  33. {
  34. IsolineBuilder.DataSource = DataSource;
  35. }
  36. var dc = drawingContext;
  37. var dataSource = DataSource;
  38. var localMinMax = dataSource.GetMinMax();
  39. var globalMinMax = dataSource.Range.Value;
  40. double lengthsRatio = globalMinMax.GetLength() / localMinMax.GetLength();
  41. if (lengthsRatio > 16)
  42. {
  43. double log = Math.Round(Math.Log(lengthsRatio, 2));
  44. double number = 2 * Math.Pow(2, log);
  45. double delta = globalMinMax.GetLength() / number;
  46. double start = Math.Floor((localMinMax.Min - globalMinMax.Min) / delta) * delta + globalMinMax.Min;
  47. double end = localMinMax.Max;
  48. var transform = Plotter2D.Transform;
  49. var strokeThickness = StrokeThickness;
  50. double x = start;
  51. while (x < end)
  52. {
  53. var collection = IsolineBuilder.BuildIsoline(x);
  54. foreach (LevelLine line in collection)
  55. {
  56. StreamGeometry lineGeometry = new StreamGeometry();
  57. using (var context = lineGeometry.Open())
  58. {
  59. context.BeginFigure(line.StartPoint.ViewportToScreen(transform), false, false);
  60. context.PolyLineTo(line.OtherPoints.ViewportToScreen(transform).ToArray(), true, true);
  61. }
  62. lineGeometry.Freeze();
  63. var paletteRatio = (line.RealValue - globalMinMax.Min) / globalMinMax.GetLength();
  64. Pen pen = new Pen(new SolidColorBrush(Palette.GetColor(paletteRatio)), strokeThickness);
  65. dc.DrawGeometry(null, pen, lineGeometry);
  66. }
  67. x += delta;
  68. }
  69. }
  70. //dc.DrawRectangle(Brushes.Green.MakeTransparent(0.3), null, new Rect(RenderSize));
  71. }
  72. }
  73. }