/// <inheritdoc /> public bool UpdateEnergyData(ILayout <TNode, TConfiguration> layout, TNode perturbedNode, TConfiguration oldConfiguration, TConfiguration newConfiguration, TNode node, TConfiguration configuration, ref TEnergyData energyData) { if (mapDescription.GetRoomDescription(node).IsCorridor) { return(true); } // MoveDistance should not be recomputed as it is used only when two nodes are neighbours which is not the case here var distanceTotal = configuration.EnergyData.CorridorConstraintData.CorridorDistance; if (AreNeighboursWithoutCorridors(perturbedNode, node)) { // Distance is taken into account only when there is no overlap var distanceOld = !configurationSpaces.HaveValidPosition(oldConfiguration, configuration) ? ComputeDistance(configuration, oldConfiguration) : 0; var distanceNew = !configurationSpaces.HaveValidPosition(newConfiguration, configuration) ? ComputeDistance(configuration, newConfiguration) : 0; distanceTotal = configuration.EnergyData.CorridorConstraintData.CorridorDistance + (distanceNew - distanceOld); } var constraintData = new CorridorConstraintData { CorridorDistance = distanceTotal }; energyData.CorridorConstraintData = constraintData; return(distanceTotal == 0); }
/// <inheritdoc /> public bool UpdateEnergyData(ILayout <TNode, TConfiguration> oldLayout, ILayout <TNode, TConfiguration> newLayout, TNode node, ref TEnergyData energyData) { if (mapDescription.GetRoomDescription(node).IsCorridor) { return(true); } oldLayout.GetConfiguration(node, out var oldConfiguration); var newDistance = oldConfiguration.EnergyData.CorridorConstraintData.CorridorDistance; foreach (var vertex in oldLayout.Graph.Vertices) { if (vertex.Equals(node)) { continue; } if (!oldLayout.GetConfiguration(vertex, out var nodeConfiguration)) { continue; } newLayout.GetConfiguration(vertex, out var newNodeConfiguration); newDistance += newNodeConfiguration.EnergyData.CorridorConstraintData.CorridorDistance - nodeConfiguration.EnergyData.CorridorConstraintData.CorridorDistance; } var constraintData = new CorridorConstraintData { CorridorDistance = newDistance }; energyData.CorridorConstraintData = constraintData; return(newDistance == 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); }