def build_roadmap(q_range, robot_dim, scene_obstacles):

    global obstacles, robot_width, robot_height, robot_radius

    obstacles = scene_obstacles  # setting the global obstacle variable
    x_limit = q_range[0]  # the range of x-positions for the robot
    y_limit = q_range[1]  # the range of y-positions for the robot
    theta_limit = q_range[
        2]  # the range of orientations for the robot (advanced extension)
    robot_width, robot_height = robot_dim[0], robot_dim[
        1]  # the dimensions of the robot, represented as an oriented bounding box

    robot_radius = max(robot_width, robot_height) / 2.
    # the roadmap
    graph = Roadmap()
    # scene1= Scene
    # qop = scene1.default_query()
    graph.addVertex((14.378, -4.328))  # Adding the start as the first vertex.
    graph.addVertex((-44.184, -26.821))  # Adding the goal as the last vertex.
    """
        The below for loop is used to create samples (vertices) where the coordinate x will be spaced equally 
        of length 3 and y will be spaced equally of length 2.5 throughout the entire plot. Both the x and y coordinate
        will be having a random noise ranging from -0.5 to 0.5.
        All these samples are checked first whether they are on the collision free space or not, if they are then
        they get added as vertices. 
    """
    for i in range(0, 33):
        x = -48 + 3 * i + (random.uniform(-0.5, 0.5))
        for j1 in range(0, 40):
            y = -48 + 2.5 * j1 + (random.uniform(-0.5, 0.5))
            coll = collision(x, y)
            if coll is True:
                graph.addVertex((x, y))
    Vertices = graph.getVertices(
    )  # A Vertices list is created with all the vertices being currently placed.
    max_dist = 5  # A maximum distance value is set to connect the vertices between them with a edge.
    """
        The for loop below will add edge between the vertices which are spaced at a distance less than the max_dist 
        variable. Once the edge is added, the interpolate function will check if the edge is passing through the C 
        obstacle space or not. If it is, then the edge gets removed. 
        Once the edge gets removed, for each parent we shall create a list of children and to remove the edges among 
        them to reduce the number of unnecessary edges.  
    """
    for i in Vertices:
        list_vertex = []
        for j in Vertices:
            dist = distance(i, j)
            if dist < max_dist and dist != 0:
                graph.addEdge(i, j, dist)
                some = interpolate(i, j, 0.5)
                if some is False:
                    graph.removeEdge(i, j)
                list_vertex.append(j)
        if len(list_vertex) >= 2:
            for rem in range(0, len(list_vertex)):
                for rem1 in range(0, len(list_vertex)):
                    if rem != rem1:
                        ss = RoadmapVertex.getEdge(list_vertex[rem],
                                                   list_vertex[rem1].id)
                        if ss is not None:
                            graph.removeEdge(list_vertex[rem],
                                             list_vertex[rem1])
    # uncomment this to export the roadmap to a file
    # graph.saveRoadmap("prm_roadmap.txt")

    return graph
def build_roadmap(q_range, robot_dim, scene_obstacles):

    global obstacles, robot_width, robot_height, robot_radius

    obstacles = scene_obstacles  # setting the global obstacle variable
    x_limit = q_range[0]  # the range of x-positions for the robot
    y_limit = q_range[1]  # the range of y-positions for the robot
    theta_limit = q_range[
        2]  # the range of orientations for the robot (advanced extension)
    robot_width, robot_height = robot_dim[0], robot_dim[
        1]  # the dimensions of the robot, represented as an oriented bounding box

    robot_radius = max(robot_width, robot_height) / 2.
    A = np.zeros((1000, 2))
    # the roadmap
    graph = Roadmap()
    list_app = []
    vertices_app = []
    scene1 = Scene
    # qop = scene1.default_query()
    goof = graph.addVertex((14.378, -4.328))
    goof1 = graph.addVertex((-44.184, -26.821))

    for i in range(0, 33):
        # x = int(np.random.uniform(-50,50))
        # y = int(np.random.uniform(-50,50))
        x = -44 + 3 * i + (random.uniform(-0.5, 1))
        for j1 in range(0, 33):
            y = -44 + 3 * j1 + (random.uniform(-0.5, 1))
            coll = collision(x, y)
            if coll is True:
                graph.addVertex((x, y))
    Vertices = graph.getVertices()
    max_dist = 5
    for i in Vertices:
        list_vertex = []
        for j in Vertices:
            dist = distance(i, j)
            # print('in loop dist', dist)
            if dist < max_dist and dist != 0:
                edge_check = graph.addEdge(i, j, dist)
                some = interpolate(i, j, 0.5)
                # print('some',some)
                if some is False:
                    graph.removeEdge(i, j)
                list_a_x = i.id
                list_a_y = j.id
                list_a = (list_a_x, list_a_y)
                list_app.append(list_a)
                list_b = (list_a_y, list_a_x)
                if list_b not in list_app:
                    graph.removeEdge(i, j)
                list_vertex.append(j)
        if len(list_vertex) >= 2:
            for rem in range(0, len(list_vertex)):
                for rem1 in range(0, len(list_vertex)):
                    if rem != rem1:
                        ss = RoadmapVertex.getEdge(list_vertex[rem],
                                                   list_vertex[rem1].id)
                        if ss is not None:
                            graph.removeEdge(list_vertex[rem],
                                             list_vertex[rem1])
    #print('build',RoadmapVertex.getConfiguration(goof1))
    # uncomment this to export the roadmap to a file
    # graph.saveRoadmap("prm_roadmap.txt")

    return graph
def build_roadmap(q_range, robot_dim, scene_obstacles):

    global obstacles, robot_width, robot_height, robot_radius

    obstacles = scene_obstacles  # setting the global obstacle variable

    x_limit = q_range[0]  # the range of x-positions for the robot
    y_limit = q_range[1]  # the range of y-positions for the robot

    robot_width, robot_height = robot_dim[0], robot_dim[1]  # the dimensions of the robot, represented as an oriented bounding box

    robot_radius = max(robot_width, robot_height)/2.

    # the roadmap
    graph = Roadmap()

    #### Sampling ####
    p = 0.02
    x_pos = np.arange(x_limit[0]+3, x_limit[1]-3, p)
    y_pos = np.arange(y_limit[0]+3, y_limit[1]-3, p)

    samples = []

    vertex = [0, 0]
    samples.append(vertex)
    first = samples.pop()
    check = collision(first)
    if not check:
        graph.addVertex(first)
    k = 1
    l = 1
    while k <= 60:
        if l == 500:
            break
        vertex = [np.random.choice(x_pos), np.random.choice(y_pos)]
        samples.append(vertex)
        trial = samples.pop()
        check1 = collision(trial)
        if not check1:
            trial_put = graph.addVertex(trial)
            k += 1
            l += 1
            vertices = graph.getVertices()
            for point in vertices:
                if not point == trial_put:
                    d = distance(point, trial_put)
                    if d < 0.2:
                        graph.removeVertex(trial_put.id)
                        k -= 1

    ########  Map Search  ##########
    vertices = graph.getVertices()
    visited = OrderedSet()
    stacked = OrderedSet()
    stacked.add(vertices[0])
    while len(stacked) != 0:
        point = stacked.pop(len(stacked) - 1)
        visited.add(point)
        current_position_x, current_position_y = point.q
        tot_neighbor = 0
        for v in vertices:
            neighbor_position_x, neighbor_position_y = v.q
            if point == v:
                continue
            neighbor_distance = distance(point, v)
            if neighbor_distance <= 0.8 and v not in stacked and v not in visited:
                stacked.add(v)
                graph.addEdge(point, v, neighbor_distance)
                tot_neighbor = tot_neighbor + 1
                for m in range(len(obstacles)):
                    step = 15
                    for x in range(1, step):
                        z = step - x
                        check_x = (x * neighbor_position_x + z * current_position_x) / (x + z)
                        check_y = (x * neighbor_position_y + z * current_position_y) / (x + z)
                        y = [check_x, check_y]
                        if collision(y) == True:
                            if v in stacked:
                                stacked.remove(v)

                            graph.removeEdge(point, v)
                            tot_neighbor = tot_neighbor - 1

            if tot_neighbor > 5:
                break

    # uncomment this to export the roadmap to a file
    # graph.saveRoadmap("prm_roadmap.txt")
    return graph
def build_roadmap(q_range, robot_dim, scene_obstacles):

    global obstacles, robot_width, robot_height, robot_radius

    obstacles = scene_obstacles  # setting the global obstacle variable
    x_limit = q_range[0]  # the range of x-positions for the robot
    y_limit = q_range[1]  # the range of y-positions for the robot
    theta_limit = q_range[
        2]  # the range of orientations for the robot (advanced extension)
    robot_width, robot_height = robot_dim[0], robot_dim[
        1]  # the dimensions of the robot, represented as an oriented bounding box

    robot_radius = max(robot_width, robot_height) / 2.
    A = np.zeros((1000, 2))
    # the roadmap
    graph = Roadmap()
    list_app = []
    list_app = []
    vertices_app = []

    goof = graph.addVertex((14.378, -4.328))
    goof1 = graph.addVertex((-44.184, -26.821))
    #graph.addVertex((14.378,-4.328))
    for i in range(0, 33):
        # x = int(np.random.uniform(-50,50))
        # y = int(np.random.uniform(-50,50))
        x = -45 + 3 * i + (random.uniform(-0.5, 0.5))
        for j1 in range(0, 33):
            y = -45 + 3 * j1 + (random.uniform(-0.5, 0.5))
            A[i][0] = x
            A[i][1] = y
            for j in range(0, 26):
                xs = []
                ys = []
                for point in obstacles[j].points:
                    count = 0
                    xs.append(point[0])
                    ys.append(point[1])
                    x_min = min(xs) - 2
                    x_max = max(xs) + 2
                    y_min = min(ys) - 2
                    y_max = max(ys) + 2
                if x_min <= x <= x_max and y_min <= y <= y_max:
                    count = 1
                    break
            if count != 1:
                graph.addVertex((x, y))
    # for qq in range(len(A)):

    Vertices = graph.getVertices()

    max_dist = 5
    for i in Vertices:
        list_vertex = []
        for j in Vertices:
            dist = distance(i, j)
            # print('in loop dist', dist)
            if dist < max_dist and dist != 0:
                edge_check = graph.addEdge(i, j, dist)
                some = interpolate(i, j, 0.5)
                # print('some',some)
                if some is False:
                    graph.removeEdge(i, j)
                list_a_x = i.id
                list_a_y = j.id
                list_a = (list_a_x, list_a_y)
                list_app.append(list_a)
                list_b = (list_a_y, list_a_x)
                if list_b not in list_app:
                    graph.removeEdge(i, j)
                list_vertex.append(j)
        if len(list_vertex) >= 2:
            for rem in range(0, len(list_vertex)):
                for rem1 in range(0, len(list_vertex)):
                    if rem != rem1:
                        ss = RoadmapVertex.getEdge(list_vertex[rem],
                                                   list_vertex[rem1].id)
                        if ss is not None:
                            graph.removeEdge(list_vertex[rem],
                                             list_vertex[rem1])
    # p_neighbour = []
    # c_neighbour = []
    #
    # for x in range(len(Vertices)):
    #     p_neighbour.clear()
    #     for z in range(len(Vertices)):
    #         if not x == z:
    #             parent = RoadmapVertex.getEdge(Vertices[x], Vertices[z].id)
    #             if not parent is None:
    #                 p_neighbour.append(Vertices[z])
    #         c_neighbour.clear()
    #         for u in range(len(p_neighbour)):
    #             for h in range(len(Vertices)):
    #                 if not u == h:
    #                     children = RoadmapVertex.getEdge(p_neighbour[u], Vertices[h].id)
    #                     if not children is None:
    #                         c_neighbour.append(Vertices[h])
    #
    #             for r in range(len(p_neighbour)):
    #                 for m in range(len(c_neighbour)):
    #                     if p_neighbour[r] == c_neighbour[m]:
    #                         graph.removeEdge(Vertices[x], Vertices[z])
    #                         break
    aa = RoadmapVertex.getEdges(goof1)
    #print('build',RoadmapVertex.getConfiguration(goof1))
    # uncomment this to export the roadmap to a file
    # graph.saveRoadmap("prm_roadmap.txt")

    return graph