/// <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);
        }
示例#2
0
        /// <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);
        }
示例#3
0
        /// <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);
        }