Exemplo n.º 1
0
def inv_replace(G, temp):
    """Return the nodes replaced by temporary node
    and build a Steiner point.
    
    Arguments:
    G -- a graph
    temp -- temporary node
    """
    neighbor = next(G.neighbors(temp))
    u, v = temp
    u_v = Segment2D(G.nodes[u]['pos'], G.nodes[v]['pos'])
    temp_neighbor = Segment2D(G.nodes[temp]['pos'], G.nodes[neighbor]['pos'])
    if temp_neighbor.intersect(u_v):
        circle = Circle(G.nodes[temp]['pos'], G.nodes[u]['pos'],
                        G.nodes[v]['pos'])
        points = circle.intersect(temp_neighbor)
        steiner_point = next((p for p in points if p != G.node[temp]['pos']))
        G.add_node(steiner_point, pos=steiner_point, color=steiner_color)
        G.add_path([u, steiner_point, v])
        G.add_edge(neighbor, steiner_point)
    else:
        if G.nodes[neighbor]['pos'].distance(
                G.nodes[u]['pos']) > G.nodes[neighbor]['pos'].distance(
                    G.nodes[v]['pos']):
            G.add_path([u, v, neighbor])
        else:
            G.add_path([v, u, neighbor])

    G.remove_node(temp)