def display_cars(self, cars):

        car_lines = []

        for n in range(0, len(cars)):
            car_lines.append(self.road[n])

        for n in range(0, len(self.totalRoads)):

            road = self.road[n]
            line_data = road.get_data()

            x_min, x_max = self.lineX(line_data)
            y_min, y_max = self.lineY(line_data)

            locX = (x_max - x_min) / 2 + x_min
            locY = (y_max - y_min) / 2 + y_min

            plot2d.plotLineTxt(locX, locY, n + 1)

        # temporal variable to hold values of cars
        points = [[], []]

        # get X cars in the graph
        i = 0
        for car in cars:
            i += 1
            random_index = randrange(len(car_lines))
            car.currentRoad = int(random_index)
            car_line = car_lines[random_index]
            point = car_line.get_xydata()[0]  # first point in the graph

            # calculate the angle
            line_data = car_line.get_data()
            ang = self.calculateAngle(line_data)

            car.prop = self.carProp(point, ang, x_min, x_max, y_min, y_max)

            # for the even cars shift angle to negative
            # so that it goes in opposite direction from car1
            car.i = i
            if i % 2 == 0:
                ang = ang + math.pi
                # for this car get the last point as positions
                point = car_line.get_xydata()[-1]

            x_min, x_max = self.lineX(line_data)
            y_min, y_max = self.lineY(line_data)

            car.initial = self.carPoint(point)

            # add scatter
            points[0].append(point[0])
            points[1].append(point[1])

            self.speed(car)  # Get Speed

        # plot cars
        self.scatter = plot2d.plotScatter(points[0], points[1])
    def display_grid(self, baseStations, conn, nroads):

        for n in range(nroads):
            if n == 0:
                p = ginp(2)
                self.points[n] = p
                self.all_points = p
            else:
                p = ginp(1)
                self.points[n] = p
                self.all_points.append(p[0])

            x1 = [x[0] for x in self.points[n]]
            y1 = [x[1] for x in self.points[n]]
            if n == 0:
                # Get all the points in the line
                self.points[n] = self.get_line(int(x1[0]), int(y1[0]),
                                               int(x1[1]), int(y1[1]))
            else:
                self.points[n] = self.get_line(int(self.all_points[n][0]),
                                               int(self.all_points[n][1]),
                                               int(p[0][0]), int(p[0][1]))
            x1 = [x[0] for x in self.points[n]]
            y1 = [x[1] for x in self.points[n]]

            self.interX[n] = x1
            self.interY[n] = y1

            # Create a line object with the x y values of the points in a line
            self.road[n] = plot2d.plotLine2d(x1, y1, color='g')
            plot2d.plotLine(self.road[n])

        for bs in baseStations:
            bs.prop = ginp(1)[0]
            bs_x = '%.2f' % bs.prop[0]
            bs_y = '%.2f' % bs.prop[1]
            self.scatter = plot2d.plotScatter(float(bs_x), float(bs_y))
            bs.params['position'] = bs_x, bs_y, 0
            bs.set_pos_wmediumd()
            plot2d.instantiateNode(bs)
            plot2d.instantiateAnnotate(bs)
            plot2d.instantiateCircle(bs)
            plot2d.text(bs)
            plot2d.circle(bs)
            plot2d.plotDraw()

        sleep(1)
        if 'src' in conn:
            for c in range(0, len(conn['src'])):
                line = plot2d.plotLine2d([conn['src'][c].params['position'][0],
                                          conn['dst'][c].params['position'][0]], \
                                       [conn['src'][c].params['position'][1],
                                        conn['dst'][c].params['position'][1]],
                                         'b', ls='dashed')
                plot2d.plotLine(line)
    def simulate_car_movement(self, cars, baseStations, scatter, com_lines,
                              mobility):
        # temporal variables
        points = [[], []]
        scatter.remove()

        nodes = cars + baseStations

        while com_lines:
            com_lines[0].remove()
            del com_lines[0]

        # iterate over each car
        for car in cars:
            # get all the properties of the car
            vel = round(np.random.uniform(car.speed[0], car.speed[1]))
            pos_x = car.prop[0]
            pos_y = car.prop[1]

            car.params['position'] = pos_x, pos_y, 0
            car.set_pos_wmediumd()
            angle = car.prop[2]

            # calculate new position of the car
            pos_x = pos_x + vel * cos(angle) * self.time_per_iteration
            pos_y = pos_y + vel * sin(angle) * self.time_per_iteration

            if (pos_x < car.prop[3] or pos_x > car.prop[4]) \
                or (pos_y < car.prop[5] or pos_y > car.prop[6]):
                self.repeat(car)
                points[0].append(car.initial[0])
                points[1].append(car.initial[1])
            else:
                car.prop[0] = pos_x
                car.prop[1] = pos_y
                points[0].append(pos_x)
                points[1].append(pos_y)

                for node in nodes:
                    if nodes == car:
                        continue
                    else:
                        # compute to see if vehicle is in range
                        inside = math.pow((node.prop[0] - pos_x), 2) + \
                                 math.pow((node.prop[1] - pos_y), 2)
                        if inside <= math.pow(node.params['range'][0], 2):
                            if isinstance(node, AP):
                                color = 'black'
                            else:
                                color = 'r'
                            line = plot2d.plotLine2d([pos_x, node.prop[0]],
                                                     [pos_y, node.prop[1]],
                                                     color=color)
                            com_lines.append(line)
                            plot2d.plotLine(line)

            plot2d.graphUpdate(car)
        eval(mobility.continuePlot)

        scatter = plot2d.plotScatter(points[0], points[1])
        plot2d.plotDraw()

        return [scatter, com_lines]