// insert a new node, such as start or target, to the abstract graph and // returns the id of the newly created node in the abstract graph // x and y are the positions where I want to put the node private Id <AbstractNode> InsertNodeIntoHierarchicalMap(HierarchicalMap map, Id <ConcreteNode> concreteNodeId, Position pos) { // If the node already existed (for instance, it was the an entrance point already // existing in the graph, we need to keep track of the previous status in order // to be able to restore it once we delete this STAL if (map.ConcreteNodeIdToAbstractNodeIdMap.ContainsKey(concreteNodeId)) { var existingAbstractNodeId = map.ConcreteNodeIdToAbstractNodeIdMap[concreteNodeId]; var nodeBackup = new NodeBackup( map.AbstractGraph.GetNodeInfo(existingAbstractNodeId).Level, map.GetNodeEdges(concreteNodeId)); nodeBackups[existingAbstractNodeId] = nodeBackup; return(map.ConcreteNodeIdToAbstractNodeIdMap[concreteNodeId]); } var cluster = map.FindClusterForPosition(pos); // create global entrance var abstractNodeId = Id <AbstractNode> .From(map.NrNodes); var entrance = cluster.AddEntrance(abstractNodeId, new Position(pos.X - cluster.Origin.X, pos.Y - cluster.Origin.Y)); cluster.UpdatePathsForLocalEntrance(entrance); map.ConcreteNodeIdToAbstractNodeIdMap[concreteNodeId] = abstractNodeId; var info = new AbstractNodeInfo( abstractNodeId, 1, cluster.Id, pos, concreteNodeId); map.AbstractGraph.AddNode(abstractNodeId, info); foreach (var entrancePoint in cluster.EntrancePoints) { if (cluster.AreConnected(abstractNodeId, entrancePoint.AbstractNodeId)) { map.AddEdge( entrancePoint.AbstractNodeId, abstractNodeId, cluster.GetDistance(entrancePoint.AbstractNodeId, abstractNodeId)); map.AddEdge( abstractNodeId, entrancePoint.AbstractNodeId, cluster.GetDistance(abstractNodeId, entrancePoint.AbstractNodeId)); } } return(abstractNodeId); }