def draw_xy_axis(self): aFont = pygame.font.Font(None, 16) for i in range(-10, 11): pos = self.translate_xy_pos_to_screen(vec2d(i, -10)) pos2 = self.translate_xy_pos_to_screen(vec2d(i, 10)) label = aFont.render('%s' % i, 1, (10, 10, 10)) self.screen.blit(label, pos) pygame.draw.line(self.screen, (0, 0, 0), pos, pos2) pos = self.translate_xy_pos_to_screen(vec3d(-10, i, 0)) pos2 = self.translate_xy_pos_to_screen(vec3d(10, i, 0)) label = aFont.render('%s' % i, 1, (10, 10, 10)) self.screen.blit(label, pos) pygame.draw.line(self.screen, (0, 0, 0), pos, pos2)
def draw_xy_axis(self): aFont = pygame.font.Font(None, 16) for i in range(-10, 11): pos = self.translate_xy_pos_to_screen(vec2d(i,-10)) pos2 = self.translate_xy_pos_to_screen(vec2d(i,10)) label = aFont.render('%s' % i, 1, (10, 10, 10)) self.screen.blit(label, pos) pygame.draw.line(self.screen, (0,0,0), pos, pos2) pos = self.translate_xy_pos_to_screen(vec3d(-10,i,0)) pos2 = self.translate_xy_pos_to_screen(vec3d(10,i,0)) label = aFont.render('%s' % i, 1, (10, 10, 10)) self.screen.blit(label, pos) pygame.draw.line(self.screen, (0,0,0), pos, pos2)
def run_system(self): count = 1 force = self.initial_force while True: box, loc = poll(self.trajectory) self.apply_force_to_box((force, loc), box) force = self.calculate_total_force_to_ground() print print '~~~~~~~~~~~~~~~~~~' print 'Iteration %s' % count for box in self.boxes: box.print_box_info() print '~~~~~~~~~~~~~~~~~~' print print 'Total force to ground: %s' % force self.prune_crushed_boxes() for box in self.boxes: box.reset_applied_forces() count += 1 self.prune_trajectory_boxes() if len(self.trajectory) == 0: break if force == vec2d(0,0): break
def get_resulting_forces(self): left_y_force = vec2d(0,0) right_y_force = vec2d(0,0) for force in self.forces_with_locs: if force[1] == 0: left_y_force.y += force[0].y elif force[1] == self.size: right_y_force.y += force[0].y else: right_y_force.y += force[0].y * (force[1]/self.size) left_y_force.y += force[0].y * (1 - force[1]/self.size) left_y_force.y = max(left_y_force.y - self.resistance, 0) right_y_force.y = max(right_y_force.y - self.resistance, 0) if left_y_force.y > 0 or right_y_force.y > 0: self.is_crushed = True self.resulting_forces = (left_y_force, right_y_force)
def calculate_total_force_to_ground(self): v = vec2d(0,0) for box in self.boxes: #no associated boxes beneath it ==> on ground if box.associated_boxes['left'] is None and box.associated_boxes['right'] is None: if box.resulting_forces is not None: #in case forces were not applied yet v += box.resulting_forces[0] v += box.resulting_forces[1] return v
def update(self): self.time += self.dt self.draw_wind_labels() self.draw_xz_fountain() self.draw_xz_axis() self.draw_xy_axis() self.draw_lines() self.draw_time_label() x_wind_did_change = self.update_x_wind() z_wind_did_change = self.update_z_wind() if x_wind_did_change or z_wind_did_change: self.adjust_initial_droplet_velocity() if len(self.droplets) < self.max_drops: new_d = Droplet(uniform(-5, 5), self.v, uniform(-5, 5)) self.draw_xy_droplet(vec2d(0, 0), new_d.pos) self.droplets.append(new_d) for d in self.droplets: oldpos = d.pos d.tx += self.dt d.ty += self.dt d.tz += self.dt if x_wind_did_change: d.tx = self.dt d.xp = oldpos.x if z_wind_did_change: d.tz = self.dt d.zp = oldpos.z d.pos = vec3d(d.x(d.tx, self.we, self.ww), d.y(d.ty), d.z(d.tz, self.wn, self.ws)) self.draw_xy_droplet(oldpos, d.pos) self.draw_xz_droplet(oldpos, d.pos) if d.pos.y <= 0 or self.translate_xy_pos_to_screen( d.pos).x >= self.w or self.translate_xy_pos_to_screen( d.pos).x <= 0: pygame.draw.circle( self.screen, (255, 255, 255), self.translate_xy_pos_to_screen(d.pos).inttup(), self.radius) pygame.draw.circle( self.screen, (255, 255, 255), self.translate_xz_pos_to_screen(d.pos).inttup(), self.radius) self.droplets.remove(d)
def update(self): self.time += self.dt self.draw_wind_labels() self.draw_xz_fountain() self.draw_xz_axis() self.draw_xy_axis() self.draw_lines() self.draw_time_label() x_wind_did_change = self.update_x_wind() z_wind_did_change = self.update_z_wind() if x_wind_did_change or z_wind_did_change: self.adjust_initial_droplet_velocity() if len(self.droplets) < self.max_drops: new_d = Droplet(uniform(-5, 5), self.v, uniform(-5, 5)) self.draw_xy_droplet(vec2d(0,0), new_d.pos) self.droplets.append(new_d) for d in self.droplets: oldpos = d.pos d.tx += self.dt d.ty += self.dt d.tz += self.dt if x_wind_did_change: d.tx = self.dt d.xp = oldpos.x if z_wind_did_change: d.tz = self.dt d.zp = oldpos.z d.pos = vec3d(d.x(d.tx, self.we, self.ww), d.y(d.ty), d.z(d.tz, self.wn, self.ws)) self.draw_xy_droplet(oldpos, d.pos) self.draw_xz_droplet(oldpos, d.pos) if d.pos.y <= 0 or self.translate_xy_pos_to_screen(d.pos).x >= self.w or self.translate_xy_pos_to_screen(d.pos).x <= 0: pygame.draw.circle(self.screen, (255,255,255), self.translate_xy_pos_to_screen(d.pos).inttup(), self.radius) pygame.draw.circle(self.screen, (255,255,255), self.translate_xz_pos_to_screen(d.pos).inttup(), self.radius) self.droplets.remove(d)
def translate_xy_pos_to_screen(self, pos): return vec2d(self.w / 4 + 30 * pos.x, 3 * self.h / 5 + 21 * (-pos.y))
def draw_xy_fountain(self): pos = self.translate_xy_pos_to_screen(vec2d(0, 0)) pygame.draw.rect(self.screen, (150, 150, 150), (pos.x - 20, pos.y, 30, 60))
def translate_xz_pos_to_screen(self, pos): return vec2d(7 * self.w / 9 + 30 * pos.x, 3 * self.h / 5 + 20 * (-pos.z))
def draw_xy_fountain(self): pos = self.translate_xy_pos_to_screen(vec2d(0,0)) pygame.draw.rect(self.screen, (150,150,150), (pos.x - 20, pos.y, 30, 60))
|__4_||__5_||__6_| ''' b6 = Box('Box 6', 10, 5, []) b5 = Box('Box 5', 10, 5, []) b4 = Box('Box 4', 10, 5, []) b3 = Box('Box 3', 10, 5, [(b5, b5.size / 2), (b6, b6.size / 2)]) b2 = Box('Box 2', 10, 5, [(b4, b4.size / 2), (b5, b5.size / 2)]) b1 = Box('Box 1', 10, 5, [(b2, b2.size / 2), (b3, b3.size / 2)]) system = BoxStack(F, [b1,b2,b3,b4,b5,b6], [(b1, b1.size/2), (b3, b3.size/2), (b6, b6.size)]) system.run_system() def weird_pyramid(F): ''' |_____1____| |__2_||__3_| |__4_||__5_||__6_| ''' b6 = Box('Box 6', 10, 5, []) b5 = Box('Box 5', 10, 5, []) b4 = Box('Box 4', 10, 5, []) b3 = Box('Box 3', 10, 5, [(b5, b5.size / 2), (b6, b6.size / 2)]) b2 = Box('Box 2', 10, 5, [(b4, b4.size / 2), (b5, b5.size / 2)]) b1 = Box('Box 1', 20, 5, [(b2, 0), (b3, b3.size)]) six_box_pyramid(vec2d(0, 80)) #weird_pyramid(vec2d(0, 80)) #F = 2550; C = ?