def update_car(self): """Updates the car each frame by updating the scene graph created by build_car.""" verts = translate_vertices(rotate_polygon(CAR_BODY, self.car_orn, [0, 0]), self.car_pos) self.update_object_coords(self.car[0], verts) # We have to rotate the local transformation of the front-AABB verts = translate_vertices(rotate_polygon(CAR_FRONT, self.car_orn, [0, 0]), self.car_pos) rot = m2d.rot_vec(FRONT_TRANS, self.car_orn) verts = list(map(lambda x: m2d.add(x, rot), verts)) self.update_object_coords(self.car[1], verts) ray_points = [] for i in range(2, 2 + self.car_rays): vec = m2d.rot_vec(RAY_LINE, self.car_orn + i*self.ray_dtheta) self.update_object_coords(self.car[i], [self.car_pos, m2d.add(self.car_pos, vec)]) ray_points.append(m2d.add(self.car_pos, vec)) i1 = len(ray_points) - 1 for i0 in range(self.car_rays): i = i0 + 2 + self.car_rays self.update_object_coords(self.car[i], [ray_points[i1], ray_points[i0]]) i1 = i0 self.visit_tiles(ray_points) for i in range(len(self.car)): self.canvas.tag_raise(self.car[i])
def draw_car(self): verts = self.translate_vertices(self.rotate_polygon(CAR_BODY, self.car_orn, [0, 0]), self.car_pos) self.update_object_coords(self.car[0], verts) # We have to rotate the local transformation of the front-AABB verts = self.translate_vertices(self.rotate_polygon(CAR_FRONT, self.car_orn, [0, 0]), self.car_pos) rot = m2d.rot_vec(FRONT_TRANS, self.car_orn) verts = list(map(lambda x: m2d.add(x, rot), verts)) self.update_object_coords(self.car[1], verts) ray_points = [] for i in range(2, 2 + self.car_rays): vec = m2d.rot_vec(RAY_LINE, self.car_orn + i*self.ray_dtheta) self.update_object_coords(self.car[i], [self.car_pos, m2d.add(self.car_pos, vec)]) ray_points.append(m2d.add(self.car_pos, vec)) i1 = len(ray_points) - 1 for i0 in range(self.car_rays): i = i0 + 2 + self.car_rays self.update_object_coords(self.car[i], [ray_points[i1], ray_points[i0]]) i1 = i0 # Test each rectangle that has not been seen against the ray triangles i1 = len(ray_points) - 1 for i0 in range(self.car_rays): tri = [self.car_pos, ray_points[i1], ray_points[i0]] if not m2d.is_ccw(tri): tri.reverse() for j in range(len(self.floor_polys)): if self.floors_seen[j]: continue elif m2d.test_intersection(tri, self.floor_polys[j]): self.canvas.itemconfig(self.floors_id[j], fill='lightblue') self.floors_seen[j] = True i1 = i0
def build_car(self, position, rays): """Builds the Tkinter objects for displaying the car. This must be called prior to draw_car.""" car = list() car.append(self.canvas.create_polygon(AABB_to_vertices(CAR_BODY), fill="blue")) car.append(self.canvas.create_polygon(AABB_to_vertices(CAR_FRONT), fill="red")) verts = translate_vertices(rotate_polygon(CAR_BODY, self.car_orn, [0, 0]), position) self.update_object_coords(car[0], verts) # We have to rotate the local transformation of the front-AABB verts = translate_vertices(rotate_polygon(CAR_FRONT, self.car_orn, [0, 0]), position) rot = m2d.rot_vec(FRONT_TRANS, self.car_orn) verts = list(map(lambda x: m2d.add(x, rot), verts)) self.update_object_coords(car[1], verts) ray_points = [] for i in range(rays): vec = m2d.rot_vec(RAY_LINE, i*self.ray_dtheta) verts = flatten([self.car_pos, m2d.add(self.car_pos, vec)]) ray_points.append(m2d.add(self.car_pos, vec)) car.append(self.canvas.create_line(*verts, fill="blue")) i1 = len(ray_points) - 1 for i0 in range(len(ray_points)): car.append(self.canvas.create_line(*[ray_points[i1], ray_points[i0]], fill="blue")) i1 = i0 return car
def build_car(self, position, rays): """Builds the mesh for the car and the view triangles for intersecting mesh geometry""" car = list() # Two rectangles and rays - 1 triangles # car[0] car.append(self.canvas.create_polygon(self.AABB_to_vertices(CAR_BODY), fill="blue")) # car[1] car.append(self.canvas.create_polygon(self.AABB_to_vertices(CAR_FRONT), fill="red")) verts = self.translate_vertices(self.rotate_polygon(CAR_BODY, self.car_orn, [0, 0]), position) self.update_object_coords(car[0], verts) # We have to rotate the local transformation of the front-AABB verts = self.translate_vertices(self.rotate_polygon(CAR_FRONT, self.car_orn, [0, 0]), position) rot = m2d.rot_vec(FRONT_TRANS, self.car_orn) verts = list(map(lambda x: m2d.add(x, rot), verts)) self.update_object_coords(car[1], verts) ray_points = [] for i in range(rays): vec = m2d.rot_vec(RAY_LINE, i*self.ray_dtheta) verts = self.flatten([self.car_pos, m2d.add(self.car_pos, vec)]) ray_points.append(m2d.add(self.car_pos, vec)) car.append(self.canvas.create_line(*verts, fill="black")) i1 = len(ray_points) - 1 for i0 in range(len(ray_points)): car.append(self.canvas.create_line(*[ray_points[i1], ray_points[i0]], fill="black")) i1 = i0 return car