Пример #1
0
        public void Test_02_CircleScaleS()
        {
            var circle = RailwayTemplates.CreateCircle(RailwayType.T4R);

            circle.TryScale(Direction.S, Railway.L3);
            var model = circle.ConvertToModel();

            Assert.AreEqual("T4T4T4T4L3T4T4T4T4L3", string.Join("", model.Order));
        }
Пример #2
0
        public void Test_4_CircleResize()
        {
            var circle = RailwayTemplates.CreateCircle(RailwayType.T4R);

            var scalable = circle.CanScale();

            Assert.IsTrue(scalable, "Кольцевая трасса должна быть масштабируема");

            var attempt = circle.TryScale(Math.PI / 2);

            Assert.IsTrue(attempt, "Кольцевая трасса должна быть масштабируема");

            attempt = circle.TryScale(0);
            Assert.IsTrue(attempt, "Кольцевая трасса должна быть масштабируема");
        }
Пример #3
0
        public void Test_1_Circle()
        {
            var head = RailwayTemplates.CreateCircle(RailwayType.T4R);

            var template = head as RailwayChain;

            var dimensions = template.Dimensions;

            Assert.AreEqual(2 * Constants.RADIUS, dimensions.Width, 1E-12, "Ширина отличается от ожидаемой");
            Assert.AreEqual(2 * Constants.RADIUS, dimensions.Height, 1E-12, "Высота отличается от ожидаемой");

            Assert.AreEqual(new Point(0, -Constants.RADIUS), dimensions.Min, "Минимальная пара координат (X,Y) отличается от ожидаемой");
            Assert.AreEqual(new Point(2 * Constants.RADIUS, Constants.RADIUS), dimensions.Max, "Максимальная пара координат (X,Y) отличается от ожидаемой");

            Assert.AreEqual(Point.Zero, dimensions.Output, "Точка выхода отличается от ожидаемой");
        }
Пример #4
0
        public void Test_01_CircleToModel()
        {
            var circle = RailwayTemplates.CreateCircle(RailwayType.T4R);
            var model  = circle.ConvertToModel();
            var text   = model.Serialize();

            var k        = 0;
            var expected = new Model();

            expected.Order = new List <string>()
            {
                "T4", "T4", "T4", "T4", "T4", "T4", "T4", "T4"
            };
            expected.Topology = expected.Order.Select(_ => new TopologyItem(k, ++k, 1)).ToList();
            expected.Topology.Add(new TopologyItem(k, 0, 1));
            var expectedText = expected.Serialize();

            Assert.AreEqual(expectedText, text);
        }
Пример #5
0
        /// <inheritdoc />
        /// <exception cref="ArgumentNullException" />
        public FinalAnswer Solve(Model model, IDirectTaskSolver checker)
        {
            _model = model; // ?? throw new ArgumentNullException(nameof(model));

            var factory = new RailwayFactory();

            // Разброс точек маршрута
            var routesSize = GetRoutesSize(model);

            // Создать стартовую трассу - кольцо
            var cycle = RailwayTemplates.CreateCircle(RailwayType.T4R);

            // Функция отображения модели
            void DisplayStep(IRailwayTemplate t)
            {
                _answer = t.ConvertToModel(_model);
                OnStepEvent?.Invoke(this, new FinalAnswer(_answer, checker.Solve(_answer)));
            }

            DisplayStep(cycle);

            var compass = RailwayTemplates.Compass(cycle);

            var              l            = 2;
            const int        CYCLES_COUNT = 5;
            IRailwayTemplate head         = cycle;

            for (var k = 0; k < CYCLES_COUNT; k++)
            {
                // Left
                for (var i = 0; i < l; i++)
                {
                    if (!head.TryScale(Direction.E, Railway.L3))
                    {
                        break;
                    }
                    DisplayStep(cycle);
                }

                // Up
                var chain1 = factory.BuildTemplate("t2T1L6", model);
                head.TryMutate(chain1);
                DisplayStep(cycle);

                // Up
                for (var i = 0; i < l; i++)
                {
                    if (!chain1.TryScale(Direction.N, Railway.L3))
                    {
                        break;
                    }
                    DisplayStep(cycle);
                }

                // Right
                var chain2 = factory.BuildTemplate("t2T1L6", model);
                chain1.TryMutate(chain2);
                DisplayStep(cycle);

                l += 3;

                // Right
                for (var i = 0; i < l; i++)
                {
                    if (!chain2.TryScale(Direction.W, Railway.L3))
                    {
                        break;
                    }
                    DisplayStep(cycle);
                }

                // Down
                var chain3 = factory.BuildTemplate("t2T1L6", model);
                chain2.TryMutate(chain3);
                DisplayStep(cycle);

                // Down
                for (var i = 0; i < l; i++)
                {
                    if (!chain3.TryScale(Direction.S, Railway.L3))
                    {
                        break;
                    }
                    DisplayStep(cycle);
                }

                // Right
                var chain4 = factory.BuildTemplate("t2T1L6", model);
                chain3.TryMutate(chain4);
                DisplayStep(cycle);

                head = chain4;
                l   += 3;
            }


            // Первый этап - расширяем кольцо вверх, вниз и в сторону

            /*
             * const int count = 16;
             * for (var i = 0; i < count; i++)
             * {
             *  // Блок, к которому добавляем L1
             *  var dest = compass.W;
             *
             *  // Расширение по сторонам
             *  if (i < count / 4) dest = compass.W;
             *  //else if (i < 2 * count / 4) dest = compass.NW;
             *  else if (i < 3 * count / 4) dest = compass.N;
             *  //else if (i < 4 * count / 4) dest = compass.NE;
             *
             *  // Чередование расширений по сторонам
             *  //if (i % 4 == 0) dest = compass.W;
             *  //else if (i % 4 == 1) dest = compass.NW;
             *  //else if (i % 4 == 2) dest = compass.N;
             *  //else if (i % 4 == 3) dest = compass.NE;
             *
             *  var chain = new RailwayChain(new[]
             *  {
             *      new Railway(RailwayType.T8L),
             *      new Railway(RailwayType.T8R),
             *  });
             *  //dest.AppendSymmetric(chain);
             *
             *  dest.AppendSymmetric(Railway.L1);
             *
             *  DisplayStep(cycle);
             * }
             */

            return(new FinalAnswer
            {
                Model = _answer,
                Price = checker.Solve(_answer),
            });
        }