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)); }
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, "Кольцевая трасса должна быть масштабируема"); }
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, "Точка выхода отличается от ожидаемой"); }
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); }
/// <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), }); }