public IEnumerable <Point> Generate(RoadGenerationTwoPoints model)
        {
            var grid = new Grid(model.Fields.GetLength(0), model.Fields.GetLength(1), 1.0f);

            for (int i = 0; i < model.Fields.GetLength(0); i++)
            {
                for (int j = 0; j < model.Fields.GetLength(1); j++)
                {
                    if (!model.Fields[i, j].InSettlement ||
                        (model.Fields[i, j].IsBlocked.HasValue && model.Fields[i, j].IsBlocked.Value))
                    {
                        grid.BlockCell(new Position(i, j));
                    }
                }
            }

            var positions = grid.GetPath(
                new Position(model.Start.X, model.Start.Y), new Position(model.End.X, model.End.Y),
                MovementPatterns.LateralOnly);

            return(positions.Select(p => new Point(p.X, p.Y)));
        }
        public IEnumerable <Point> GenerateStraight(RoadGenerationTwoPoints model)
        {
            var(minX, maxX) = model.Start.X < model.End.X
                ? (model.Start.X, model.End.X)
                : (model.End.X, model.Start.X);

            var(minY, maxY) = model.Start.Y < model.End.Y
                ? (model.Start.Y, model.End.Y)
                : (model.End.Y, model.Start.Y);

            var positions = new List <Point>();

            if (model.Start.X.Equals(model.End.X))
            {
                for (int i = minY; i <= maxY; i++)
                {
                    positions.Add(new Point(model.Start.X, i));
                }
            }
            else
            {
                for (int i = minX; i <= maxX; i++)
                {
                    positions.Add(new Point(i, model.Start.Y));
                }
            }

            var toRemove = positions
                           .OrderByDescending(p => p.DistanceTo(model.Start))
                           .TakeWhile(s => !model.Fields[s.X, s.Y].InSettlement ||
                                      (model.Fields[s.X, s.Y].IsBlocked.HasValue &&
                                       model.Fields[s.X, s.Y].IsBlocked.Value))
                           .ToList();

            toRemove.ForEach(r => positions.Remove(r));

            return(positions);
        }