/// <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); }
/// <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); }