protected override void UpdateDataSource()
 {
     if (DataSource != null)
     {
         IsolineBuilder.DataSource   = DataSource;
         IsolineBuilder.MissingValue = MissingValue;
         Collection = IsolineBuilder.BuildIsoline();
     }
     else
     {
         Collection = null;
     }
 }
        protected override void OnRender(DrawingContext drawingContext)
        {
            if (Plotter2D == null)
            {
                return;
            }
            if (DataSource == null)
            {
                return;
            }

            var collection = (IsolineCollection)Parent.GetValue(IsolineCollectionProperty);

            if (collection == null)
            {
                return;
            }

            var bounds = ViewportPanel.GetViewportBounds(this);

            if (bounds.IsEmpty)
            {
                return;
            }

            var dc = drawingContext;
            var strokeThickness = StrokeThickness;

            var transform = Plotter2D.Transform.WithRects(bounds, new Rect(RenderSize));

            //dc.DrawRectangle(null, new Pen(Brushes.Green, 2), new Rect(RenderSize));

            var additionalLevels = GetAdditionalLevels(collection);

            IsolineBuilder.DataSource = DataSource;
            var additionalIsolineCollections = additionalLevels.Select(level =>
            {
                return(IsolineBuilder.BuildIsoline(level));
            });

            foreach (var additionalCollection in additionalIsolineCollections)
            {
                RenderIsolineCollection(dc, strokeThickness, additionalCollection, transform);
            }
        }
        protected override void OnRender(DrawingContext drawingContext)
        {
            if (Plotter2D == null)
            {
                return;
            }
            if (Collection == null)
            {
                return;
            }
            if (DataSource == null)
            {
                return;
            }
            if (Collection.Lines.Count == 0)
            {
                IsolineBuilder.DataSource   = DataSource;
                IsolineBuilder.MissingValue = MissingValue;
                Collection = IsolineBuilder.BuildIsoline();
            }

            IsolineCollection = Collection;

            var dc = drawingContext;
            var strokeThickness = StrokeThickness;
            var collection      = Collection;

            var bounds = DataRect.Empty;

            // determining content bounds
            foreach (LevelLine line in collection)
            {
                foreach (Point point in line.AllPoints)
                {
                    bounds.Union(point);
                }
            }

            Viewport2D.SetContentBounds(this, bounds);
            ViewportPanel.SetViewportBounds(this, bounds);

            if (bounds.IsEmpty)
            {
                return;
            }

            // custom transform with output set to renderSize of this control
            var transform = Plotter2D.Transform.WithRects(bounds, new Rect(RenderSize));

            // actual drawing of isolines
            RenderIsolineCollection(dc, strokeThickness, collection, transform);

            //var additionalLevels = GetAdditionalIsolines(collection);

            //var additionalIsolineCollections = additionalLevels.Select(level => IsolineBuilder.BuildIsoline(level));

            //foreach (var additionalCollection in additionalIsolineCollections)
            //{
            //    RenderIsolineCollection(dc, strokeThickness, additionalCollection, transform);
            //}

            RenderLabels(dc, collection);

            //    foreach (var additionalCollection in additionalIsolineCollections)
            //    {
            //        RenderLabels(dc, additionalCollection);
            //    }
        }