/// <inheritdoc />
        public bool ComputeEnergyData(TLayout layout, TNode node, TConfiguration configuration, ref TEnergyData energyData)
        {
            if (mapDescription.IsCorridorRoom(node))
            {
                return(true);
            }

            var distance   = 0;
            var neighbours = graphWithoutCorridors.GetNeighbours(node).ToList();

            foreach (var vertex in neighbours)
            {
                if (vertex.Equals(node))
                {
                    continue;
                }

                if (!layout.GetConfiguration(vertex, out var c))
                {
                    continue;
                }

                if (!configurationSpaces.HaveValidPosition(configuration, c))
                {
                    distance += ComputeDistance(configuration, c);
                }
            }

            var energy = ComputeEnergy(0, distance);

            energyData.CorridorDistance = distance;
            energyData.Energy          += energy;

            return(distance == 0);
        }
示例#2
0
        public bool ComputeEnergyData(ILayout <TNode, TConfiguration> layout, TNode node, TConfiguration configuration, ref TEnergyData energyData)
        {
            var isCorridor = optimizeCorridors && mapDescription.GetRoomDescription(node).IsCorridor;

            var overlap   = 0;
            var distance  = 0;
            var neighbors = layout.Graph.GetNeighbours(node).ToList();

            foreach (var vertex in layout.Graph.Vertices)
            {
                if (vertex.Equals(node))
                {
                    continue;
                }

                if (!layout.GetConfiguration(vertex, out var c))
                {
                    continue;
                }

                var area = ComputeOverlap(configuration, c);

                if (area != 0)
                {
                    overlap += area;
                }
                else if (!isCorridor && neighbors.Contains(vertex))
                {
                    if (!configurationSpaces.HaveValidPosition(configuration, c))
                    {
                        // TODO: this is not really accurate when there are more sophisticated door positions (as smaller distance is not always better)
                        distance += ComputeDistance(configuration, c);
                    }
                }
            }

            var constraintData = new BasicConstraintData {
                Overlap = overlap, MoveDistance = distance
            };

            energyData.BasicConstraintData = constraintData;

            return(overlap == 0 && distance == 0);
        }
        /// <inheritdoc />
        /// <returns>True if there is no overlap and all neighbours are connected by doors.</returns>
        public bool ComputeEnergyData(TLayout layout, TNode node, TConfiguration configuration, ref TEnergyData energyData)
        {
            var overlap    = 0;
            var distance   = 0;
            var neighbours = layout.Graph.GetNeighbours(node).ToList();

            foreach (var vertex in layout.Graph.Vertices)
            {
                if (vertex.Equals(node))
                {
                    continue;
                }

                if (!layout.GetConfiguration(vertex, out var c))
                {
                    continue;
                }

                var area = ComputeOverlap(configuration, c);

                if (area != 0)
                {
                    overlap += area;
                }
                else if (neighbours.Contains(vertex))
                {
                    if (!configurationSpaces.HaveValidPosition(configuration, c))
                    {
                        // TODO: this is not really accurate when there are more sophisticated door positions (as smaller distance is not always better)
                        distance += ComputeDistance(configuration, c);
                    }
                }
            }

            var energy = ComputeEnergy(overlap, distance);

            energyData.Overlap      = overlap;
            energyData.MoveDistance = distance;
            energyData.Energy      += energy;

            return(overlap == 0 && distance == 0);
        }
示例#4
0
        /// <inheritdoc />
        public bool ComputeEnergyData(ILayout <TNode, TConfiguration> layout, TNode node, TConfiguration configuration, ref TEnergyData energyData)
        {
            if (mapDescription.GetRoomDescription(node).IsCorridor)
            {
                return(true);
            }

            var distance   = 0;
            var neighbours = graphWithoutCorridors.GetNeighbours(node).ToList();

            foreach (var vertex in neighbours)
            {
                if (vertex.Equals(node))
                {
                    continue;
                }

                if (!layout.GetConfiguration(vertex, out var c))
                {
                    continue;
                }

                // TODO: why wasn't this here?
                if (!AreNeighboursWithoutCorridors(vertex, node))
                {
                    continue;
                }

                if (!configurationSpaces.HaveValidPosition(configuration, c))
                {
                    distance += ComputeDistance(configuration, c);
                }
            }

            var constraintData = new CorridorConstraintData {
                CorridorDistance = distance
            };

            energyData.CorridorConstraintData = constraintData;

            return(distance == 0);
        }
示例#5
0
        /// <inheritdoc />
        public bool ComputeEnergyData(TLayout layout, TNode node, TConfiguration configuration, ref TEnergyData energyData)
        {
            if (mapDescription.GetRoomDescription(node).GetType() == typeof(CorridorRoomDescription))
            {
                return(true);
            }

            var distance   = 0;
            var neighbours = stageOneGraph.GetNeighbours(node).ToList();

            foreach (var vertex in neighbours)
            {
                if (vertex.Equals(node))
                {
                    continue;
                }

                if (!layout.GetConfiguration(vertex, out var c))
                {
                    continue;
                }

                // TODO: why wasn't this here?
                if (!AreNeighboursWithoutCorridors(vertex, node))
                {
                    continue;
                }

                if (!configurationSpaces.HaveValidPosition(configuration, c))
                {
                    distance += ComputeDistance(configuration, c);
                }
            }

            var energy = ComputeEnergy(0, distance);

            energyData.CorridorDistance = distance;
            energyData.Energy          += energy;

            return(distance == 0);
        }