/// <inheritdoc /> /// <summary> /// Pertubs a position of a given node by getting a random point from a maximum /// intersection of configuration space of already laid out neighbours. TODO: is "laid out" ok? /// </summary> public virtual void PerturbPosition(TLayout layout, TNode node, bool updateLayout) { var configurations = new List <TConfiguration>(); foreach (var neighbour in layout.Graph.GetNeighbours(node)) { if (layout.GetConfiguration(neighbour, out var configuration)) { configurations.Add(configuration); } } if (!layout.GetConfiguration(node, out var mainConfiguration)) { throw new InvalidOperationException(); } var newPosition = ConfigurationSpaces.GetRandomIntersectionPoint(mainConfiguration, configurations); var newConfiguration = mainConfiguration.SmartClone(); newConfiguration.Position = newPosition; if (updateLayout) { UpdateLayout(layout, node, newConfiguration); return; } layout.SetConfiguration(node, newConfiguration); }
/// <summary> /// Perturbs a non corridor position using configuration spaces generated especially for perturbing non corridors. /// </summary> /// <param name="layout"></param> /// <param name="node"></param> /// <param name="updateLayout"></param> protected void PerturbNonCorridorPosition(TLayout layout, TNode node, bool updateLayout) { var configurations = GetNeighboursOverCorridors(layout, node); if (!layout.GetConfiguration(node, out var mainConfiguration)) { throw new InvalidOperationException(); } var newPosition = CorridorConfigurationSpaces.GetRandomIntersectionPoint(mainConfiguration, configurations, out var configurationsSatisfied); // If zero configurations were satisfied, that means that the current shape was not compatible // with any of its neighbours so we perturb shape instead. if (configurationsSatisfied == 0) { PerturbShape(layout, node, updateLayout); return; } var newConfiguration = mainConfiguration.SmartClone(); newConfiguration.Position = newPosition; if (updateLayout) { UpdateLayout(layout, node, newConfiguration); return; } layout.SetConfiguration(node, newConfiguration); }
/// <inheritdoc /> /// <summary> /// Pertubs a position of a given node by getting a random point from a maximum /// intersection of configuration space of already laid out neighbours. TODO: is "laid out" ok? /// </summary> public virtual void PerturbPosition(TLayout layout, TNode node, bool updateLayout) { var configurations = new List <TConfiguration>(); foreach (var neighbour in layout.Graph.GetNeighbours(node)) { if (layout.GetConfiguration(neighbour, out var configuration)) { configurations.Add(configuration); } } if (!layout.GetConfiguration(node, out var mainConfiguration)) { throw new InvalidOperationException(); } var newPosition = ConfigurationSpaces.GetRandomIntersectionPoint(mainConfiguration, configurations, out var configurationsSatisfied); // If zero configurations were satisfied, that means that the current shape was not compatible // with any of its neighbours so we perturb shape instead. if (configurationsSatisfied == 0) { PerturbShape(layout, node, updateLayout); return; } var newConfiguration = mainConfiguration.SmartClone(); newConfiguration.Position = newPosition; if (updateLayout) { UpdateLayout(layout, node, newConfiguration); return; } layout.SetConfiguration(node, newConfiguration); }
/// <summary> /// Perturbs a non corridor position using configuration spaces generated especially for perturbing non corridors. /// </summary> /// <param name="layout"></param> /// <param name="node"></param> /// <param name="updateLayout"></param> protected void PerturbNonCorridorPosition(TLayout layout, TNode node, bool updateLayout) { var configurations = GetNeighboursOverCorridors(layout, node); if (!layout.GetConfiguration(node, out var mainConfiguration)) { throw new InvalidOperationException(); } var newPosition = CorridorConfigurationSpaces.GetRandomIntersectionPoint(mainConfiguration, configurations); var newConfiguration = mainConfiguration.SmartClone(); newConfiguration.Position = newPosition; if (updateLayout) { UpdateLayout(layout, node, newConfiguration); return; } layout.SetConfiguration(node, newConfiguration); }