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); }
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); } }