public void DifficultTest() { /* * 11 x 11 * * 0 0 0 0 0 0 0 0 0 0 0 * 0 0 0 0 0 0 0 0 0 0 0 * 0 0 0 0 0 0 0 * * * * * 0 0 0 0 0 0 0 * * * * * * * 0 0 0 0 0 0 0 0 * * * 0 0 0 * * * * * * * * 0 0 0 * * * * * * 0 0 * * * 0 * * * * * * 0 0 * * * 0 0 0 0 0 0 * 0 0 0 0 0 0 0 0 0 0 0 * 0 0 0 0 0 0 0 0 0 0 0 */ var rectangles = new SimplifiedRectangle[] { new SimplifiedRectangle(0, 4, 2, 6), new SimplifiedRectangle(2, 2, 4, 3), new SimplifiedRectangle(6, 3, 10, 5), new SimplifiedRectangle(7, 7, 10, 8), }; var start = new Vector2(0, 0); var finish = new Vector2(10, 10); var path = AlgorithmsMethods.FindPathAmongRectangles(start, finish, rectangles); // результат непредсказуем, т.к. юзаем бфс :) ; //Assert.AreEqual(4, path.Length); }
public IntersectionResult GetSegmentSimplifiedRectangleIntersection_TestCase(bool filled, params double[] nums) { var seg = new Segment(nums[0], nums[1], nums[2], nums[3]); var rect = new SimplifiedRectangle(nums[4], nums[5], nums[6], nums[7]); return(GeometryMethods.GetSegmentSimplifiedRectangleIntersection(seg, rect, out var result, filled)); }
private static bool IsSegmentIntersectingRectangle(Segment seg, SimplifiedRectangle rect) { var intersection = GeometryMethods.GetSegmentSimplifiedRectangleIntersection(seg, rect, out var intres, true); if (intersection == IntersectionResult.None) { return(false); } if (intersection == IntersectionResult.Point) { if (intres.Equals(seg.Begin) || intres.Equals(seg.End)) { return(false); } } if (intersection == IntersectionResult.Points) { var points = (Vector2[])intres; if (seg.Begin.Equals(points[0]) && seg.End.Equals(points[1]) || seg.Begin.Equals(points[1]) && seg.End.Equals(points[0])) { return(false); } } return(true); }
public bool IsSimplifiedRectanglesInterescting_TestCase(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4) { var rect1 = new SimplifiedRectangle(x1, y1, x2, y2); var rect2 = new SimplifiedRectangle(x3, y3, x4, y4); return(GeometryMethods.IsSimplifiedRectanglesInterescting(rect1, rect2)); }
/// <summary> /// Юзаем бфс :) /// </summary> public static Vector2[] FindPathAmongRectangles(Vector2 start, Vector2 finish, params SimplifiedRectangle[] rectangles) { //var begInRect = GeometryMethods.IsPointInsideSimplifiedRectangle(start, rect); //var endInRect = GeometryMethods.IsPointInsideSimplifiedRectangle(finish, rect); //if (begInRect && !endInRect || !begInRect && endInRect) // return new Vector2[0]; if (rectangles.Length == 0) { return new Vector2[] { finish } } ; var searchRect = new SimplifiedRectangle(start, finish); rectangles = rectangles .Where(e => GeometryMethods.IsSimplifiedRectanglesInterescting(searchRect, e)) .ToArray(); var queue = new Queue <Vector2>(); queue.Enqueue(start); var visited = new HashSet <Vector2> { start }; var parent = new Dictionary <Vector2, Vector2?>(); while (queue.Count > 0) { var current = queue.Dequeue(); var seg = new Segment(current, finish); if (!rectangles.Any(r => IsSegmentIntersectingRectangle(seg, r))) { parent[finish] = current; break; } foreach (var n in GetNeighbors(current, rectangles, visited)) { parent[n] = current; visited.Add(n); queue.Enqueue(n); // проверка на visited в GetNeighbors - для ускорения } } var result = new LinkedList <Vector2>(); var a = finish; while (parent.ContainsKey(a)) { result.AddFirst(a); a = parent[a].Value; } return(result.ToArray()); }
public void WithoutBarriers() { var rectangles = new SimplifiedRectangle[0]; var start = new Vector2(0, 0); var finish = new Vector2(10, 10); var path = AlgorithmsMethods.FindPathAmongRectangles(start, finish, rectangles); Assert.AreEqual(1, path.Length); Assert.AreEqual(finish, path[0]); }
public void OneBarrier() { var rectangles = new SimplifiedRectangle[] { new SimplifiedRectangle(25, 25, 75, 75), }; var start = new Vector2(0, 0); var finish = new Vector2(100, 100); var path = AlgorithmsMethods.FindPathAmongRectangles(start, finish, rectangles); Assert.AreEqual(2, path.Length); Assert.AreEqual(finish, path[1]); }
public void PathToRectMiddleFromItsVertext() { var rectangles = new SimplifiedRectangle[] { new SimplifiedRectangle(0, 0, 20, 20) }; var start = new Vector2(0, 0); var finish = new Vector2(10, 10); var path = AlgorithmsMethods.FindPathAmongRectangles(start, finish, rectangles); Assert.IsEmpty(path); }