/// <inheritdoc />
        /// <summary>
        /// Perturbs a node by getting random shapes from configurations spaces until a
        /// different shape is found.
        /// </summary>
        /// <param name="layout"></param>
        /// <param name="node"></param>
        /// <param name="updateLayout"></param>
        public virtual void PerturbShape(TLayout layout, TNode node, bool updateLayout)
        {
            layout.GetConfiguration(node, out var configuration);

            // Return the current layout if a given node cannot be shape-perturbed
            if (!ConfigurationSpaces.CanPerturbShape(node))
            {
                return;
            }

            TShapeContainer shape;

            do
            {
                shape = ConfigurationSpaces.GetRandomShape(node);
            }while (ReferenceEquals(shape, configuration.Shape));

            var newConfiguration = configuration.SmartClone();

            newConfiguration.ShapeContainer = shape;

            if (updateLayout)
            {
                UpdateLayout(layout, node, newConfiguration);
                return;
            }

            layout.SetConfiguration(node, newConfiguration);
        }
示例#2
0
        /// <inheritdoc />
        /// <summary>
        /// Perturbs a node by getting random shapes from configurations spaces until a
        /// different shape is found.
        /// </summary>
        /// <param name="layout"></param>
        /// <param name="node"></param>
        /// <param name="updateLayout"></param>
        public virtual void PerturbShape(TLayout layout, TNode node, bool updateLayout)
        {
            layout.GetConfiguration(node, out var configuration);

            // Return the current layout if a given node cannot be shape-perturbed
            if (!ConfigurationSpaces.CanPerturbShape(node))
            {
                return;
            }

            var possibleShapes = RoomShapesHandler.GetPossibleShapesForNode(layout, node, false);

            if (possibleShapes.Count == 0)
            {
                return;
            }

            var shape            = possibleShapes.GetRandom(Random);
            var newConfiguration = configuration.SmartClone();

            newConfiguration.ShapeContainer = shape;

            if (updateLayout)
            {
                UpdateLayout(layout, node, newConfiguration);
                return;
            }

            layout.SetConfiguration(node, newConfiguration);
        }