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
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)
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
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)
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)
def square(self, x, y): return Square(Point(x, y), type=Square.SOLID)
def robot(self): robot = Robot() robot.body.point = Point(40, 40) robot.body.heading = 0 return robot
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)
def height(self): return max(self.__squares, key=lambda s: s.point.y, default=Square(Point(0, -1), Square.OPEN)).point.y + 1
def width(self): return max(self.__squares, key=lambda s: s.point.x, default=Square(Point(-1, 0), Square.OPEN)).point.x + 1
def center(self, scale=1): return self.__point.translate(Point(0.5, 0.5)).scale(scale)
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))