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);
        }
Exemplo n.º 2
0
        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));
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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));
        }
Exemplo n.º 5
0
        /// <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);
        }