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