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)