public void  Update(ShortestAvoidancePathFinder finder, IEnumerable <Point> points)
        {
            var targetPoints = points.Take(2).ToList();
            var graph        = targetPoints.Count == 2 ?
                               finder.GetVisualGraph(targetPoints[0].ToCoordinate(), targetPoints[1].ToCoordinate())
                : finder.GetVisualGraph();

            lines = graph.Select(l => new LineGeometry(l.P0.ToPoint(), l.P1.ToPoint()));
        }
 public DrawingVisualEdges(ShortestAvoidancePathFinder finder, IEnumerable <Point> points)
 {
     IsReadOnly = true;
     Update(finder, points);
 }
Example #3
0
        private void ComputeShorestPath()
        {
            var components = canvas.GetDrawingComponents();
            var points     = components.OfType <DrawingPoint>().ToList();

            if (points.Count < 2)
            {
                if (paths.Count > 0)
                {
                    paths.ForEach(p => canvas.RemoveVisual(p));
                    paths.Clear();
                }
                return;
            }

            if (points.Count % 2 != 0)
            {
                points.RemoveAt(points.Count - 1);
            }

            var pointsCount = points.Count;

            if (preVersion == -1 || (preVersion != canvas._version))
            {
                var geom = GeometryCombiner.Combine(components.Where(c => !c.IsReadOnly && !(c is DrawingPoint)).Select(c => c.ToNTSGeometry()));
                finder = new ShortestAvoidancePathFinder(geom);
                finder.BufferDistance        = finderSettings.BufferDistance;
                finder.InternalPointBehavior = (BreakThroughObstaclesBahavior)finderSettings.ObstacleBehavior;
                finder.BuildVisualGraph();
                preVersion = canvas._version;
            }

            finder.InternalPointBehavior = (BreakThroughObstaclesBahavior)finderSettings.ObstacleBehavior;

            int pathIndex = 0;

            for (int i = 0; i < pointsCount; i += 2, pathIndex++)
            {
                var path = finderSettings.PathCategory == 0 ?
                           finder.FindShortestPath(points[i].Point.ToCoordinate(), points[i + 1].Point.ToCoordinate())
                    : finder.FindAlongShortestPath(points[i].Point.ToCoordinate(), points[i + 1].Point.ToCoordinate());

                if (path.Count == 0)
                {
                    pathIndex--;
                    continue;
                }

                var coos = path.Select(l => l.P0).ToList();
                coos.Add(path.Last().P1);
                var targetPoints = coos.Select(c => c.ToPoint());

                if (pathIndex < paths.Count)
                {
                    paths[pathIndex].Update(targetPoints, false);
                    paths[pathIndex].Render(DrawingCanvas.HighLightPen);
                }
                else
                {
                    var drawingLineString = new DrawingLineString(targetPoints, false);
                    drawingLineString.IsReadOnly = true;
                    drawingLineString.Render(DrawingCanvas.HighLightPen);
                    canvas.AddVisual(drawingLineString);
                    paths.Add(drawingLineString);
                }
            }

            if (pathIndex < paths.Count)
            {
                for (int i = pathIndex; i < paths.Count; i++)
                {
                    canvas.RemoveVisual(paths[i]);
                }
                paths.RemoveRange(pathIndex, paths.Count - pathIndex);
            }
        }