def neighborhood_k(index, points, K):
    root = None
    for q,i in zip(G._vertex, range(len(G._vertex))):
        node_data = NodeData(euc_dist(points[index], q), i)
        if root is not None:
            root.insert(node_data)
        else:
            root = Node(node_data)
    neighborhood_vertex = []
    root.SortedUntil(K, neighborhood_vertex)
    neighborhood_vertex = list(map(lambda x: x.data, neighborhood_vertex))
    return neighborhood_vertex
def get_oposition_points_by_distance(edge_indexes, alone_vertex_index, points):
    root = None
    edge = points[(edge_indexes)]
    alone_vertex = points[alone_vertex_index]
    k = 0
    for (point_index, point) in zip(range(len(points)),points):
        if point_index not in edge_indexes and on_semi_plan_opposed(*edge, alone_vertex, point):
            node_data = NodeData(distance_to_segment2(*edge, point), point_index)
            # node_data = NodeData(distance_to_segment(*edge, point), point_index)
            k += 1
            if root is not None:
                root.insert(node_data)
            else:
                root = Node(node_data)
    neighborhood_vertex = []
    if root:
        root.SortedUntil(k, neighborhood_vertex)
        neighborhood_vertex = list(map(lambda x: x.data, neighborhood_vertex))
    return neighborhood_vertex