public void Fill(EmptyAreaGroup emptyAreaGroup)
        {
            var buildingTypesBySize = BuildingTypesProvider.GetGroupedBySize();

            for (var index = 0; index < buildingTypesBySize.Count; ++index)
            {
                var buildingTypesOfEqualSize = buildingTypesBySize[index];
                var tileAnglesCombinations   = new TileAnglesCombinations(emptyAreaGroup.Tiles);
                while (tileAnglesCombinations.Any())
                {
                    var buildingLocation  = _randomBuildingLocationGenerator.Generate(tileAnglesCombinations, buildingTypesOfEqualSize);
                    var building          = buildingLocation.Instantiate();
                    var placingPointOnMap = _map.GetLocationOf(buildingLocation.Tile);

                    tileAnglesCombinations.RemoveAngleForTile(buildingLocation.Angle, buildingLocation.Tile);

                    _buildingOnMapIfPossibleLocator.TryLocate(building, placingPointOnMap);
                    if (ShallFinishWithCurrentBuildingType(emptyAreaGroup, index))
                    {
                        break;
                    }
                }
            }

            var mapParameters = new MapFillingParametersCalculator().Calculate(_map);
        }
        public BuildingLocation Generate(
            TileAnglesCombinations tileAnglesCombinations,
            BuildingTypesOfEqualSize buildingTypesOfEqualSize)
        {
            var randomTile = tileAnglesCombinations.GetRandomTile();
            var angle      = tileAnglesCombinations.GetRandomAngleForTile(randomTile);
            var type       = buildingTypesOfEqualSize.GetRandomType();

            return(new BuildingLocation(type, randomTile, angle));
        }