コード例 #1
0
 def find(self, id):
     map = Map(id)
     with open("%s.json" % id) as json_file:
         data = json.load(json_file)['map']
         for y in range(data['height']):
             for x in range(data['width']):
                 matching_square = self.match(x, y, data['squares'])
                 if matching_square:
                     map.append(
                         Square(Point(x, y),
                                type_name=matching_square['type']))
                 else:
                     map.append(Square(Point(x, y), Square.OPEN))
     return map
コード例 #2
0
 def __draw(self, max_width=None):
     self.__canvas.delete("all")
     self.__robot_last_position = None
     self.__robot_avatar = None
     self.__square_size = square_size = int(
         (max_width - 10) / self.__map.width)
     self.__scale = (max_width - 10) / (self.__map.width * self.__map.square_size)
     self.__square_map.clear()
     for square in self.__map.squares:
         fill = self.__fill_for(square.type)
         tl = Point(square.point.x * square_size + MapCanvasManager.PADDING,
                    square.point.y * square_size + MapCanvasManager.PADDING)
         br = Point(square.point.x * square_size + square_size + MapCanvasManager.PADDING,
                    square.point.y * square_size + square_size + MapCanvasManager.PADDING)
         rectangle_id = self.__canvas.create_rectangle(
             tl.x, tl.y, br.x, br.y, fill=fill, outline='black', tags='square')
         self.__square_map[rectangle_id] = (square, tl)
コード例 #3
0
 def is_obstacle(self, square, robot):
     north = robot.body.point.translate(Point(0, self.__map.square_size))
     for line in square.lines(self.__map.square_size, robot.body.point):
         start_point = line[0]
         end_point = line[1]
         start_angle = self.__angle(north, robot.body.point, start_point)
         end_angle = self.__angle(north, robot.body.point, end_point)
         if (start_angle <= robot.body.heading <= end_angle) or (
                 start_angle >= robot.body.heading >= end_angle):
             return True
     return False
コード例 #4
0
    def _init_layout(self):
        super().window.title("World")

        self.__frame_left = tk.Frame(super().window)
        self.__frame_left.pack(side=tk.LEFT, ipadx=10, ipady=10)

        self.__button_load = tk.Button(self.__frame_left,
                                       text="Load",
                                       command=self.__load_map)
        self.__button_load.pack()

        self.__button_save = tk.Button(self.__frame_left,
                                       text="Save",
                                       command=self.__save_map)
        self.__button_save.pack()

        self.__frame_right = tk.Frame(super().window)
        self.__frame_right.pack(side=tk.RIGHT)

        self.__frame_right_top = tk.Frame(self.__frame_right, height=20)
        self.__frame_right_top.pack(ipadx=10, ipady=10)
        self.__frame_right_middle = tk.Frame(self.__frame_right, height=100)
        self.__frame_right_middle.pack(ipadx=10, ipady=10)
        self.__frame_right_bottom = tk.Frame(self.__frame_right, height=20)
        self.__frame_right_bottom.pack(ipadx=10, ipady=10)

        self.__button_start = tk.Button(self.__frame_right_top,
                                        text="Start",
                                        command=partial(
                                            self._start, self.__start_robot))
        self.__button_start.pack()
        self.__button_ping = tk.Button(self.__frame_right_top,
                                       text="Ping",
                                       command=self.__ping)
        self.__button_ping.pack()

        self.__canvas_robot = tk.Canvas(self.__frame_right_middle, width=100)
        self.__canvas_robot.pack()
        self.__robot_canvas_manager = RobotCanvasManager(self.__canvas_robot)
        self.__robot_canvas_manager.draw()

        self.__robot = Robot()
        self.__robot.body.point = Point(100, 60)
        self.__robot.body.time_scale = 10

        self.__pin_manager = PinManager(self.__frame_right_bottom)
        self.__pin_manager.listener = self.__pin_listener

        self.__canvas = tk.Canvas(super().window)
        self.__canvas.pack(fill="both", expand=True)
        self.__map_canvas_manager = MapCanvasManager(self.__canvas)
        self.__map_canvas_manager.locate(self.__robot)
コード例 #5
0
    def __init__(self, canvas):
        self.__square_map = {}
        self.__canvas = canvas
        self.__canvas.bind("<Configure>", self.__configure)
        self.__canvas.tag_bind(
            'square', '<ButtonPress-1>', self.__on_square_click)
        self.__robot_last_square = None
        self.__robot_last_position = None
        self.__robot_avatar = None
        self.__square_size = 1
        self.__scale = 1

        self.__map_repository = MapRepository()
        self.__map = Map('map', square_size_cm=MapCanvasManager.SQUARE_SIZE)
        for y in range(MapCanvasManager.DEFAULT_ROOM_HEIGHT):
            for x in range(MapCanvasManager.DEFAULT_ROOM_WIDTH):
                self.__map.append(Square(Point(x, y), type=Square.OPEN))

        self.__obstacle_identifier = ObstacleIdentifier(self.__map)
コード例 #6
0
 def square(self, x, y):
     return Square(Point(x, y), type=Square.SOLID)
コード例 #7
0
 def robot(self):
     robot = Robot()
     robot.body.point = Point(40, 40)
     robot.body.heading = 0
     return robot
コード例 #8
0
 def __create_circle(self, point, r, fill='green'):
     radius = Point(r, r)
     tl = point - radius
     br = point + radius
     return self.__canvas.create_oval(tl.x, tl.y, br.x, br.y, fill=fill)
コード例 #9
0
 def height(self):
     return max(self.__squares,
                key=lambda s: s.point.y,
                default=Square(Point(0, -1), Square.OPEN)).point.y + 1
コード例 #10
0
 def width(self):
     return max(self.__squares,
                key=lambda s: s.point.x,
                default=Square(Point(-1, 0), Square.OPEN)).point.x + 1
コード例 #11
0
 def center(self, scale=1):
     return self.__point.translate(Point(0.5, 0.5)).scale(scale)
コード例 #12
0
 def points(self, scale=1):
     return (self.__point.scale(scale),
             self.__point.translate(Point(1, 0)).scale(scale),
             self.__point.translate(Point(1, 1)).scale(scale),
             self.__point.translate(Point(0, 1)).scale(scale))