public void Generate_BasicTest() { var roomTemplate1 = new RoomTemplate(PolygonGrid2D.GetSquare(10), new SimpleDoorMode(1, 0), TransformationGrid2DHelper.GetAllTransformationsOld().ToList()); var roomTemplate2 = new RoomTemplate(PolygonGrid2D.GetRectangle(5, 10), new SimpleDoorMode(1, 0), TransformationGrid2DHelper.GetAllTransformationsOld().ToList()); var roomDescription1 = new BasicRoomDescription(new List <RoomTemplate>() { roomTemplate1 }); var roomDescription2 = new BasicRoomDescription(new List <RoomTemplate>() { roomTemplate1, roomTemplate2 }); var mapDescription = new MapDescription <int>(); mapDescription.AddRoom(0, roomDescription1); mapDescription.AddRoom(1, roomDescription2); mapDescription.AddConnection(0, 1); var configurationSpaces = generator.GetConfigurationSpaces <Configuration <CorridorsData> >(mapDescription); Assert.That(configurationSpaces.GetShapesForNode(0).Count, Is.EqualTo(1)); Assert.That(configurationSpaces.GetShapesForNode(1).Count, Is.EqualTo(3)); Assert.That(configurationSpaces.GetAllShapes().Count, Is.EqualTo(3)); }
private ConfigurationSpaces <Configuration <CorridorsData> > GetConfigurationSpaces(MapDescription <int> mapDescription) { return(configurationSpacesGenerator.GetConfigurationSpaces <Configuration <CorridorsData> >(mapDescription)); }
private void SetupGenerator() { var mapping = mapDescription.GetMapping(); var chainsGeneric = configuration.Chains; if (chainsGeneric == null) { var chainDecomposition = new TwoStageChainDecomposition <TNode>(mapDescriptionOriginal, new BreadthFirstChainDecomposition <TNode>(configuration.ChainDecompositionConfiguration ?? new ChainDecompositionConfiguration())); chainsGeneric = chainDecomposition.GetChains(mapDescriptionOriginal.GetGraph()); } var chains = chainsGeneric .Select(x => new Chain <int>(x.Nodes.Select(y => mapping[y]).ToList(), x.Number)) .ToList(); var generatorPlanner = new GeneratorPlanner <Layout <Configuration <CorridorsData> >, int>(configuration.SimulatedAnnealingMaxBranching); var configurationSpacesGenerator = new ConfigurationSpacesGenerator( new PolygonOverlap(), DoorHandler.DefaultHandler, new OrthogonalLineIntersection(), new GridPolygonUtils()); var configurationSpaces = configurationSpacesGenerator.GetConfigurationSpaces <Configuration <CorridorsData> >(mapDescription); //var corridorConfigurationSpaces = mapDescription.IsWithCorridors ? configurationSpacesGenerator.Generate<TNode, Configuration<CorridorsData>>(mapDescription, mapDescription.CorridorsOffsets) : configurationSpaces; var corridorConfigurationSpaces = configurationSpaces; var averageSize = configurationSpaces.GetAverageSize(); var polygonOverlap = new FastPolygonOverlap(); var stageOneConstraints = new List <INodeConstraint <Layout <Configuration <CorridorsData> >, int, Configuration <CorridorsData>, CorridorsData> > { new BasicConstraint <Layout <Configuration <CorridorsData> >, int, Configuration <CorridorsData>, CorridorsData, IntAlias <PolygonGrid2D> >( new FastPolygonOverlap(), averageSize, configurationSpaces ), new CorridorConstraints <Layout <Configuration <CorridorsData> >, int, Configuration <CorridorsData>, CorridorsData, IntAlias <PolygonGrid2D> >( mapDescription, averageSize, corridorConfigurationSpaces ), }; if (!configuration.RoomsCanTouch) { stageOneConstraints.Add(new TouchingConstraints <Layout <Configuration <CorridorsData> >, int, Configuration <CorridorsData>, CorridorsData, IntAlias <PolygonGrid2D> >( mapDescription, polygonOverlap )); } var stageOneConstraintsEvaluator = new ConstraintsEvaluator <Layout <Configuration <CorridorsData> >, int, Configuration <CorridorsData>, IntAlias <PolygonGrid2D>, CorridorsData>(stageOneConstraints); //if (mapDescription.IsWithCorridors) //{ // layoutOperations.AddNodeConstraint(new CorridorConstraints<Layout<Configuration<CorridorsData>>, int, Configuration<CorridorsData>, CorridorsData, IntAlias<GridPolygon>>( // mapDescription, // averageSize, // corridorConfigurationSpaces // )); // if (!false) // TODO: // { // var polygonOverlap = new FastPolygonOverlap(); // layoutOperations.AddNodeConstraint(new TouchingConstraints<Layout<Configuration<CorridorsData>>, int, Configuration<CorridorsData>, CorridorsData, IntAlias<GridPolygon>>( // mapDescription, // polygonOverlap // )); // } //} var roomShapesHandler = new RoomShapesHandler <int, Configuration <CorridorsData> >( configurationSpaces, configurationSpaces.GetIntAliasMapping(), mapDescription, configuration.RepeatModeOverride ); var layoutOperations = new LayoutOperations <Layout <Configuration <CorridorsData> >, int, Configuration <CorridorsData>, IntAlias <PolygonGrid2D>, CorridorsData>(corridorConfigurationSpaces, configurationSpaces.GetAverageSize(), mapDescription, stageOneConstraintsEvaluator, stageOneConstraintsEvaluator, roomShapesHandler, configuration.ThrowIfRepeatModeNotSatisfied); var initialLayout = new Layout <Configuration <CorridorsData> >(mapDescription.GetGraph()); var layoutConverter = new BasicLayoutConverter <Layout <Configuration <CorridorsData> >, TNode, Configuration <CorridorsData> >(mapDescription, configurationSpaces, configurationSpaces.GetIntAliasMapping()); var layoutEvolver = new PlatformersEvolver <Layout <Configuration <CorridorsData> >, int, Configuration <CorridorsData> >(layoutOperations); generator = new ChainBasedGenerator <Layout <Configuration <CorridorsData> >, MapLayout <TNode>, int>(initialLayout, generatorPlanner, chains, layoutEvolver, layoutConverter); generator.OnRandomInjected += (random) => { ((IRandomInjectable)configurationSpaces).InjectRandomGenerator(random); ((IRandomInjectable)layoutOperations).InjectRandomGenerator(random); ((IRandomInjectable)layoutEvolver).InjectRandomGenerator(random); ((IRandomInjectable)layoutConverter).InjectRandomGenerator(random); }; generator.OnCancellationTokenInjected += (token) => { ((ICancellable)generatorPlanner).SetCancellationToken(token); ((ICancellable)layoutEvolver).SetCancellationToken(token); }; // layoutEvolver.OnEvent += (sender, args) => OnSimulatedAnnealingEvent?.Invoke(sender, args); layoutEvolver.OnPerturbed += (sender, layout) => OnPerturbed?.Invoke(layoutConverter.Convert(layout, false)); layoutEvolver.OnPerturbed += (sender, layout) => OnPerturbedInternal?.Invoke(layout); layoutEvolver.OnValid += (sender, layout) => OnPartialValid?.Invoke(layoutConverter.Convert(layout, true)); generatorPlanner.OnLayoutGenerated += layout => OnValid?.Invoke(layoutConverter.Convert(layout, true)); }