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)
Example #3
0
 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
Example #4
0
 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)
Example #5
0
 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 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))
Example #14
0
        |__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 = ?