Exemple #1
0
    def test_is_intersect(self):
        bodyA = Body(BodyGeometry(15, 15, 10, 10))  #10,10 20,20
        bodyB = Body(BodyGeometry(15, 15, 10, 10))

        bodyC = Body(BodyGeometry(15, 5, 10, 10))  #10,0 20,10
        bodyD = Body(BodyGeometry(15, 25, 10, 10))  #10,20 20,30
        bodyE = Body(BodyGeometry(5, 15, 10, 10))  #0,10 10,20
        bodyF = Body(BodyGeometry(25, 15, 10, 10))  #20,10 30,20

        bodyG = Body(BodyGeometry(15, 6, 10, 10))  #10,1 20,11
        bodyH = Body(BodyGeometry(15, 24, 10, 10))  #10,19 20,29
        bodyI = Body(BodyGeometry(6, 15, 10, 10))  #1,10 11,20
        bodyJ = Body(BodyGeometry(24, 15, 10, 10))  #19,10 29,20

        self.assertTrue(bodyA.is_intersect(bodyB))

        self.assertFalse(bodyA.is_intersect(bodyC))
        self.assertFalse(bodyA.is_intersect(bodyD))
        self.assertFalse(bodyA.is_intersect(bodyE))
        self.assertFalse(bodyA.is_intersect(bodyF))

        self.assertTrue(bodyA.is_intersect(bodyG))
        self.assertTrue(bodyA.is_intersect(bodyH))
        self.assertTrue(bodyA.is_intersect(bodyI))
        self.assertTrue(bodyA.is_intersect(bodyJ))
Exemple #2
0
    def __init__(self):
        self.body = [Body(0, 0), Body(-1, 0), Body(-2, 0)]
        self.body_sprites = pg.sprite.Group()
        self.body_sprites.add(self.body)

        # momentum inicial eh pra esquerda
        self.momentum = [1, 0]
Exemple #3
0
	def __init__(self):
		
		n=2
		fpos = 500000000
		fvel = 100
		
		self.bodies = []
		
		self.bodies.append(Body([-0.97000436, 0.24308753],
								[-0.93240737/2.0, -0.86473146/2.0],
								1.0,
								'#FF0000',
								'1'))
		
		self.bodies.append(Body([0.97000436, -0.24308753],
								[-0.93240737/2.0, -0.86473146/2.0],
								1.0,
								'#00FF00',
								'2'))
		
		self.bodies.append(Body([0.0, 0.0],
								[0.93240737, 0.86473146],
								1.0,
								'#0000FF',
								'3'))
		
		self.gravitationalConstant = 1
		self.minDist = 0
		self.skipFrames 		= 0
		self.timeStep 			= 0.001
		self.plotSize 			= 2.0
		self.annotationShift 	= self.plotSize/25.0
		self.markSizes 			= [50,200]
		self.lockedBody 		= -1
Exemple #4
0
    def processEvents(self):
        for event in pg.event.get():
            if event.type == pg.KEYDOWN:
                if event.key == pg.K_SPACE:
                    self.paused = not self.paused

                if event.key == pg.K_a:
                    self.display[
                        'acceleration'] = not self.display['acceleration']

                if event.key == pg.K_n:
                    pos = pg.mouse.get_pos()
                    body = Body(self.color['body'], 10**6, 10, Vector(*pos),
                                Vector(0, 0), Vector(0, 0))
                    self.spawn(body)

                if event.key == pg.K_s:
                    mouse_pos = Vector(*pg.mouse.get_pos())
                    body = Body(self.color['white'], 10**9, 10, mouse_pos,
                                Vector(0, 0), Vector(0, 0))
                    self.spawn(body)

                if event.key == pg.K_q:
                    self.running = False

                if event.key == pg.K_v:
                    self.display['velocity'] = not self.display['velocity']

                if event.key == pg.K_x:
                    mouse_pos = Vector(*pg.mouse.get_pos())
                    for position, body in self.bodies.copy().items():
                        if mouse_pos.distance(position) < body.radius:
                            self.kill(position)
def main():
    
    sun = Body(SUN_MASS, 0, 0, 0, 0, 24, 1, 1, 0,)                           # Yellow Sun
    earth = Body(EARTH_MASS, SUN_EARTH, 0, 0, 30000, 8, 0, 0, 1)            # blue earth
    mercury = Body(MERCURY_MASS, SUN_MERCURY, 0, 0, 48000, 3, 1, 0.6, 0)    # Brown Mercury
    venus = Body(VENUS_MASS, SUN_VENUS, 0, 0, 35000, 6.5, 0, 1, 0)          # Green Venus
    mars = Body(MARS_MASS, SUN_MARS, 0, 0, 24000, 5, 1, 0, 0)               # Red Mars
    
    solar = System([sun, mercury, venus, earth, mars])                      # Create the system
    
    set_clear_color(0, 0, 0)    # black background
    enable_smoothing()

    while not window_closed(): 
        clear()
        
        
        # Draw the system in its current state.
        solar.draw(WINDOW_WIDTH / 2, WINDOW_HEIGHT / 2, PIXELS_PER_METER)
    
        # Update the system for its next state.
        solar.update(TIMESTEP * TIME_SCALE)
    
        # Draw the frame and take a brief nap.
        request_redraw()
        sleep(TIMESTEP)
Exemple #6
0
 def setUp(self) -> None:
     self.mars = Body(M_MASS, M_COLOR, M_INIT_POS, M_INIT_VEL, M_INIT_ACC,
                      M_INIT_FORCE)
     self.phobos = Body(P_MASS, P_COLOR, P_INIT_POS, P_INIT_VEL, P_INIT_ACC,
                        P_INIT_FORCE)
     self.deimos = Body(D_MASS, D_COLOR, D_INIT_POS, D_INIT_VEL, D_INIT_ACC,
                        D_INIT_FORCE)
Exemple #7
0
def example():
    windows = tkinter.Tk()
    windows.title('snake')
    windows.geometry('320x240')
    canvas = tkinter.Canvas(windows, bg='black', width=320, height=240)
    canvas.pack()

    snake = GuiSnake(canvas)

    bodyA = Body(BodyGeometry(15, 5, 10, 10))  #10,0
    bodyB = Body(BodyGeometry(25, 5, 10, 10))  #20,0
    bodyC = Body(BodyGeometry(35, 5, 10, 10))  #30,0
    bodyD = Body(BodyGeometry(45, 5, 10, 10))  #40,0
    snake.add_head(bodyA)
    snake.add_head(bodyB)
    snake.add_head(bodyC)
    snake.add_head(bodyD)

    def move(event):
        print(event.keysym)
        if 'Up' == event.keysym:
            snake.move_up(10)
        elif 'Down' == event.keysym:
            snake.move_down(10)
        elif 'Left' == event.keysym:
            snake.move_left(10)
        elif 'Right' == event.keysym:
            snake.move_right(10)

    windows.bind('<Up>', move)
    windows.bind('<Down>', move)
    windows.bind('<Left>', move)
    windows.bind('<Right>', move)

    windows.mainloop()
Exemple #8
0
    def start_the_bodies(self, n: int):
        """
        Initialize N bodies with random positions and circular velocities
        """
        # Put something heavy into the center
        self.bodies.append(Body(0, 0, 0, 0, 1e6 * self.solar_mass))

        # Put some bodies around it
        for i in range(n):
            px = (self.radius + 1e8) * exp(-1.8) * (.5 - random())
            py = (self.radius + 1e8) * exp(-1.8) * (.5 - random())
            magv = self.circular_velocity(px, py) * (0.7 + random() * 0.5)

            absangle = atan(abs(py / px))
            thetav = pi / 2 - absangle

            # https://finnaarupnielsen.wordpress.com/2011/05/18/where-is-the-sign-function-in-python/
            vx = -1 * copysign(1, py) * cos(thetav) * magv
            vy = copysign(1, px) * sin(thetav) * magv

            # Most objects should orbit in one direction, but there may be exceptions
            if random() <= 0.8:
                vx = -vx
                vy = -vy

            mass = random() * self.solar_mass * 30 + 1e20
            self.bodies.append(Body(px, py, vx, vy, mass))
Exemple #9
0
def main():
    # Solar system data comes from
    #   http://hyperphysics.phy-astr.gsu.edu/hbase/solar/soldata2.html
    sun = Body(1.98892e30, 0, 0, 0, 0, 15, 1, 1, 0)
    mercury = Body(.06 * EM, -.3871 * AU, 0, 0, 47890, 3, 1, .4, 0)
    venus = Body(.82 * EM, -.7233 * AU, 0, 0, 35040, 6, 0, .6, .2)
    earth = Body(1.0 * EM, -1.0 * AU, 0, 0, 29790, 7, 0, .4, 1)
    mars = Body(.11 * EM, -1.524 * AU, 0, 0, 24140, 4, .8, .2, 0)

    solar_system = System([sun, mercury, venus, earth, mars])

    set_clear_color(0, 0, 0)  # black background
    enable_smoothing()

    while not window_closed():
        clear()

        # Draw the system in its current state.
        solar_system.draw(WINDOW_WIDTH / 2, WINDOW_HEIGHT / 2,
                          PIXELS_PER_METER)

        # Update the system for its next state.
        solar_system.update(TIMESTEP * TIME_SCALE)

        # Draw the frame and take a brief nap.
        request_redraw()
        sleep(TIMESTEP)
def main():
    earth = Body(5.9736e24, 0, 0, 0, 0, 24, 0, 0, 1)  # blue earth
    moon = Body(7.3477e22, 3.84403e8, 0, 0, 1022, 4, 1, 1, 1)  # white moon
    earth_moon = System([earth, moon])

    set_clear_color(0, 0, 0)  # black background
    enable_smoothing()

    while not window_closed():
        clear()

        moon.update_velocity(
            -0.25, -0.00004, TIMESTEP * TIME_SCALE
        )  # This is my new addition. I update the moon's velocity and position
        moon.update_position(
            TIMESTEP * TIME_SCALE
        )  # so that the moon moves and I can check the body class' methods

        # Draw the system in its current state.
        earth_moon.draw(WINDOW_WIDTH / 2, WINDOW_HEIGHT / 2, PIXELS_PER_METER)

        # Update the system for its next state.
        # earth_moon.update(TIMESTEP * TIME_SCALE)

        # Draw the frame and take a brief nap.
        request_redraw()
        sleep(TIMESTEP)
    def generate_bullets(self, x, y, target, gamma):
        angle = calculate_angle(x, y, *target)
        pos_0 = (x + 20 * cos(angle + 0.74*pi), y - 20 * sin(angle + 0.74*pi))
        pos_1 = (x + 20 * cos(angle - 0.74*pi), y - 20 * sin(angle - 0.74*pi))

        return [(RegularBullet(*pos_0, self.bul_dmg, self.bul_vel, angle, Body(self.bul_body))),
                (RegularBullet(*pos_1, self.bul_dmg, self.bul_vel, angle, Body(self.bul_body)))]
Exemple #12
0
    def __init__(self, position, rotation=90, scale=1, size=50, speed=300, turn_speed=5):
        Creature.__init__(self, position, rotation, scale, size, speed, turn_speed)

        self.head = Body(self, self.position, self.rotation, self.size, self.size, Categories.PLAYER, head=True, speed=speed)

        self.bodies.append(self.head)

        for i in range(0):
            size = self.size
            b = Body(self, self.position, self.rotation, size, size, Categories.PLAYER, speed=10)
            b.attach_to(self.bodies[i])
            self.bodies.append(b)
        
        #arm1 = Leg(self.head, 10, 90, 30, offset=(self.head.width/2, 0), foot_size=10, walk=False)
        #self.head.add_leg(arm1)
        #arm2 = Leg(self.head, 10, -90, 30, offset=(-self.head.width/2, 0), foot_size=10, walk=False)
        #self.head.add_leg(arm2)
        #self.arms.append(arm1)
        #self.arms.append(arm2)

        for body in self.bodies:
            body.add_leg(Leg(body, self.size*2, 15, 15, offset=(body.width/2 + 1, 0), foot_size=3))
            body.add_leg(Leg(body, self.size*2, -15, 15, offset=(-body.width/2 - 1, 0), foot_size=3))

        self.arm_counter = 0
Exemple #13
0
def handle_event():
    for event in pygame.event.get():
        if event.type == QUIT:
            Game.done = True
        elif event.type == KEYDOWN:
            if event.key == K_ESCAPE:
                Game.done = True
            elif event.key == K_LEFT:
                o = Game.seasaw.orient - 0.1
                Game.seasaw.setOrient(o)
            elif event.key == K_RIGHT:
                o = Game.seasaw.orient + 0.1
                Game.seasaw.setOrient(o)
        #elif event.type == MOUSEBUTTONDOWN:

    b1, b2, b3 = pygame.mouse.get_pressed()
    if b1:
        Game.counter += 1
        if Game.counter % 7 == 0:
            mouseX, mouseY = pygame.mouse.get_pos()
            #size =  randint(10,40)
            #b = Body(Circle(size), mouseX, Game.screen_size[1]-mouseY)
            #verts = []
            #vertCount = randint(3, Polygon.MAX_POLY_VERTEX_COUNT)
            #for i in range(vertCount):
            #    verts.append(Vec2(randrange(-40,40), randrange(-40,40)))
            hw = randrange(10, 40)
            hh = randrange(10, 40)

            #b = Body(Polygon(verts=verts), mouseX, Game.screen_size[1]-mouseY)
            b = Body(Polygon(boxHw=hw, boxHh=hh), mouseX, mouseY)
            #b.setOrient(1.5)

            Game.bodies.append(b)
            #print("vertices:",b.shape.vertices)
            #print("normals:", b.shape.normals)
    elif b2:
        Game.counter += 1
        if Game.counter % 7 == 0:
            mouseX, mouseY = pygame.mouse.get_pos()

            verts = []
            vertCount = randint(3, Polygon.MAX_POLY_VERTEX_COUNT)
            for i in range(vertCount):
                verts.append(Vec2(randrange(-40, 40), randrange(-40, 40)))

            b = Body(Polygon(verts=verts), mouseX, mouseY)

            Game.bodies.append(b)
            #print("vertices:",b.shape.vertices)
            #print("normals:", b.shape.normals)

    elif b3:
        Game.counter += 1
        if Game.counter % 7 == 0:
            mouseX, mouseY = pygame.mouse.get_pos()
            size = randint(10, 40)
            b = Body(Circle(size), mouseX, mouseY)
            Game.bodies.append(b)
    def generate_bullets_auto(x, y, target, gamma):
        pos_0 = (x + 96 * cos(gamma + 0.25*pi), y - 96 * sin(gamma + 0.25*pi))
        pos_1 = (x + 96 * cos(gamma - 0.25*pi), y - 96 * sin(gamma - 0.25*pi))
        angle_0 = calculate_angle(*pos_0, *target)
        angle_1 = calculate_angle(*pos_1, *target)

        return [RegularBullet(*pos_0, -1, 1.5, angle_0, Body(SMALL_BUL_BODY_1)),
                RegularBullet(*pos_1, -1, 1.5, angle_1, Body(SMALL_BUL_BODY_1))]
Exemple #15
0
 def setUp(self) -> None:
     mars = Body(M_MASS, M_COLOR, M_INIT_POS, M_INIT_VEL, M_INIT_ACC,
                 M_INIT_FORCE)
     phobos = Body(P_MASS, P_COLOR, P_INIT_POS, P_INIT_VEL, P_INIT_ACC,
                   P_INIT_FORCE)
     deimos = Body(D_MASS, D_COLOR, D_INIT_POS, D_INIT_VEL, D_INIT_ACC,
                   D_INIT_FORCE)
     self.system = SimulatedSystem(mars, phobos, deimos)
    def generate_bullets(self, x, y, target, gamma):
        angle = calculate_angle(x, y, *target)
        xo, yo = self.get_reference_point(x, y, angle)
        pos_0 = xo + 6 * sin(angle), yo + 6 * cos(angle)
        pos_1 = xo - 6 * sin(angle), yo - 6 * cos(angle)

        return [RegularBullet(*pos_0, self.bul_dmg, self.bul_vel, angle, Body(self.bul_body)),
                RegularBullet(*pos_1, self.bul_dmg, self.bul_vel, angle, Body(self.bul_body))]
    def generate_bullets(self, x, y, target, gamma):
        angle = calculate_angle(x, y, *target)
        xo, yo = self.get_reference_point(x, y, angle)
        pos_0 = (xo, yo)
        pos_1 = (xo + 53 * cos(angle + 0.48*pi), yo - 53 * sin(angle + 0.48*pi))
        pos_2 = (xo + 53 * cos(angle - 0.48*pi), yo - 53 * sin(angle - 0.48*pi))

        return [(RegularBullet(*pos_0, -5, 0.75, angle, Body(BIG_BUL_BODY_1))),
                (RegularBullet(*pos_1, -1, 0.1,  angle, Body(SMALL_BUL_BODY_1))),
                (RegularBullet(*pos_2, -1, 0.1,  angle, Body(SMALL_BUL_BODY_1)))]
Exemple #18
0
    def test_count(self):
        body = Body(BodyGeometry(15, 15, 10, 10))
        baseSnake = BaseSnake(body)
        count = 1
        self.assertEqual(count, baseSnake.count())

        body2 = Body(BodyGeometry(15, 15, 10, 10))
        baseSnake.add_head(body2)
        count += 1
        self.assertEqual(count, baseSnake.count())
Exemple #19
0
def main() -> None:
    """Initialize celestial bodies and display their simulation."""
    mars = Body(M_MASS, M_COLOR, M_INIT_POS, M_INIT_VEL, M_INIT_ACC,
                M_INIT_FORCE)
    phobos = Body(P_MASS, P_COLOR, P_INIT_POS, P_INIT_VEL, P_INIT_ACC,
                  P_INIT_FORCE)
    deimos = Body(D_MASS, D_COLOR, D_INIT_POS, D_INIT_VEL, D_INIT_ACC,
                  D_INIT_FORCE)

    display_simulation(mars, phobos, deimos)
    def generate_bullets(self, x, y, target, gamma):
        angle = calculate_angle(x, y, *target)
        xo, yo = self.get_reference_point(x, y, angle)
        pos_0 = (xo, yo)
        pos_1 = (xo + 15 * sin(angle - 0.17*pi), yo + 15 * cos(angle - 0.17*pi))
        pos_2 = (xo - 15 * sin(angle + 0.17*pi), yo - 15 * cos(angle + 0.17*pi))

        return [RegularBullet(*pos_0, self.bul_dmg, self.bul_vel, angle,             Body(self.bul_body)),
                RegularBullet(*pos_1, self.bul_dmg, self.bul_vel, angle - 0.17 * pi, Body(self.bul_body)),
                RegularBullet(*pos_2, self.bul_dmg, self.bul_vel, angle + 0.17 * pi, Body(self.bul_body))]
Exemple #21
0
 def reset(self):
     print("resetting bodies")
     for planet in self.planets:
         self.game.del_game_object(planet)
     self.planets.clear()
     self.planets = [
         Body(self.game, "Sun", 1.9891e30, np.array([0, 0]),
              np.array([0, 0]), 5, (255, 0, 0), False),
         Body(self.game, "Mercury", 0.330e24, np.array([0, -57.9e9]),
              np.array([47.4e3, 0]), 3, (255, 255, 0), self.TRACE_ENABLED),
         Body(self.game, "Venus", 4.87e24, np.array([0, -108.2e9]),
              np.array([35e3, 0]), 3, (0, 255, 255), self.TRACE_ENABLED),
         Body(self.game, "Earth", 5.97219e24, np.array([0, -149.6e9]),
              np.array([29.78e3, 0]), 3, (0, 0, 255), self.TRACE_ENABLED),
         Body(self.game, "Mars", 0.642e24, np.array([0, -227.9e9]),
              np.array([24.1e3, 0]), 3, (150, 0, 0), self.TRACE_ENABLED),
         Body(self.game, "Jupiter", 1.89813e27, np.array([0, -778.5e9]),
              np.array([13.06e3, 0]), 3, (0, 255, 0), self.TRACE_ENABLED),
         Body(self.game, "Saturn", 568e24, np.array([0, -1433.5e9]),
              np.array([9.7e3, 0]), 3, (0, 150, 150), self.TRACE_ENABLED),
         Body(self.game, "Uranus", 86.8e24, np.array([0, -2872.5e9]),
              np.array([6.8e3, 0]), 3, (150, 150, 0), self.TRACE_ENABLED),
         Body(self.game, "Neptune", 102e24, np.array([0, -4495.1e9]),
              np.array([5.4e3, 0]), 3, (150, 150, 150), self.TRACE_ENABLED),
     ]
Exemple #22
0
    def build_level(self):
        # there's 7 levels
        self.level %= 7
        # get configuration of level:
        this_level = self.levels[self.level]['map']  # get the map
        # start positions of the first brick
        start_x, start_y = self.levels[self.level]['cnf'][0:2]
        # thikness of drawables stuffs
        this_thikness = self.levels[self.level]['cnf'][2]
        this_pad_w = self.levels[self.level]['cnf'][3]
        this_pad_vel = self.levels[self.level]['cnf'][4]
        this_ball_vel = self.levels[self.level]['cnf'][5]
        self.level_title = self.levels[self.level]['cnf'][6]

        # 1 - create the pad
        for i in range(PAD_SIZE):
            x_pos = self.boundary.w / 2 - (PAD_W / 2)
            y_pos = self.boundary.h - (PAD_H + 5)
            self.pad.append(Body(TYPE_PADDLE, x_pos, y_pos, BAL_COL))
            self.pad[i].shape.w = this_pad_w
            self.pad[i].thikness = this_thikness
            self.pad[i].xvel = this_pad_vel

        # 2 - create ball and let make it start from the center of the pad
        for i in range(BALL_SIZE):
            x_pos = self.pad[0].shape.x + (PAD_W / 2)
            y_pos = self.pad[0].shape.y - (CIRCLE_RADIUS + 1)
            self.ball.append(Body(TYPE_CIRCLE, x_pos, y_pos, BAL_COL))
            self.ball[i].xvel = self.ball[i].yvel = -this_ball_vel
            self.ball[i].thikness = this_thikness
        del x_pos, y_pos

        # 3 - build the level
        x_pos = start_x
        y_pos = start_y
        i = 0
        for row in this_level:
            for brick in row:
                if brick == 'n':  # normal
                    self.color = NORMAL_BRICK
                elif brick == 's':  # solid
                    self.color = SOLID_BRICK
                elif brick == 'r':  # rock
                    self.color = ROCK_BRICK
                elif brick == 'b':  # bonus
                    self.color = BONUS_BRICK
                elif brick == ' ':  # empty space
                    x_pos += BRICK_W + 3
                    continue
                self.brick.append(Body(TYPE_BRICK, x_pos, y_pos, self.color))
                self.brick[i].thikness = this_thikness
                i += 1
                x_pos += BRICK_W + 3
            y_pos += BRICK_H + 1
            x_pos = start_x
    def generate_bullets(self, x, y, target, gamma):
        xo, yo = x + 90 * cos(gamma + 0.75*pi), y - 90 * sin(gamma + 0.75*pi)
        angle_0 = calculate_angle(xo, yo, *target)
        pos_0 = (xo + 40 * cos(angle_0), yo - 40 * sin(angle_0))

        xo, yo = x + 90 * cos(gamma - 0.75*pi), y - 90 * sin(gamma - 0.75*pi)
        angle_1 = calculate_angle(xo, yo, *target)
        pos_1 = (xo + 40 * cos(angle_1), yo - 40 * sin(angle_1))

        return [RegularBullet(*pos_0, self.bul_dmg, self.bul_vel, angle_0, Body(self.bul_body)),
                RegularBullet(*pos_1, self.bul_dmg, self.bul_vel, angle_1, Body(self.bul_body))]
Exemple #24
0
def main():

    logger = get_logger(__name__)

    print("Earth + Sun")
    body1 = Body(id='a',
                 mass=1,
                 position=[0, 0, 0],
                 v0=[0, 0, 0],
                 color='yellow',
                 logger=logger)
    body2 = Body(id='b',
                 mass=1,
                 position=[1, 0, 0],
                 v0=[0, 10, 0],
                 color='blue',
                 logger=logger)
    # body3 = Body(id='c', mass=1*CONST_M_EARTH, position=[-1*CONST_AU, 0,          0], v0=[0,0,0],             color='blue',  logger=logger)

    bodies = [body1, body2]

    # calculate relative positions between all the bodies
    # relpos_success = physics.relative_positions(bodies, logger=logger)
    # net_gravity_success = physics.net_gravity(bodies, logger=logger)
    # calc_acceleration_success = physics.calc_acceleration(bodies, logger=logger)
    # net_force_success = system_net_force_check(bodies, logger=logger)

    dt = 86400
    t0 = 0
    tf = dt * 300
    times = np.arange(t0, tf + 1, dt)

    fig, ax = plt.subplots(1, 1)
    fig.set_size_inches(8, 5)

    for t in times:
        relpos_success = physics.relative_positions(bodies, logger=logger)
        net_gravity_success = physics.net_gravity(bodies, logger=logger)
        calc_acceleration_success = physics.calc_acceleration(bodies,
                                                              logger=logger)
        calc_velocity_success = physics.calc_velocity(bodies,
                                                      dt,
                                                      logger=logger)
        calv_position_success = physics.calc_position(bodies,
                                                      dt,
                                                      logger=logger)

        for body in bodies:
            ax.scatter(body.position[0],
                       body.position[1],
                       label=body.name,
                       color=body.color)

    fig.savefig("./fig.png")
Exemple #25
0
 def __init__(self, pos1, vel1, pos2, vel2):
     self.bodies = [
         Body(color=(255, 0, 0)),
         Body(color=(0, 255, 0),
              pos=np.array([*pos1]),
              vel=np.array([*vel1])),
         Body(color=(0, 0, 255),
              pos=np.array([*pos2]),
              vel=np.array([*vel2]))
     ]
     self.cur_body = self.bodies[0]
     self.v3 = np.array([0.0, 0.0, 0.0])
Exemple #26
0
 def setUp(self):
     body1 = Body(BodyGeometry(1, 1, 0, 0))
     body2 = Body(BodyGeometry(2, 1, 0, 0))
     body3 = Body(BodyGeometry(3, 1, 0, 0))
     body4 = Body(BodyGeometry(4, 1, 0, 0))
     self._bodys = [body4, body3, body2, body1]
     self._baseSnake = BaseSnake()
     index = len(self._bodys) - 1
     while index >= 0:
         #    self._baseSnake.add_head(self._bodys[index]) 这样添加到_baseSnake的body跟_bodys里面的body是相同的对象
         self._baseSnake.add_head(copy.deepcopy(self._bodys[index]))
         index -= 1
Exemple #27
0
def demo_1() -> World:
    world = World(gravity=GRAVITY, iterations=IMPULSE_ITERATIONS)

    body_1 = Body([100.0, 20.0])
    body_1.position = np.array([0.0, 0.5 * body_1.width[1]])
    world.add_body(body_1)

    body_2 = Body([5.0, 5.0], 200.0)
    body_2.position = np.array([0.0, 40.0])
    world.add_body(body_2)

    return world
Exemple #28
0
def init():

    pygame.init()
    Game.screen = pygame.display.set_mode(Game.screen_size)
    pygame.display.set_caption("physics engine 2d")
    Game.done = False
    Game.clock = pygame.time.Clock()

    #b = Body( Circle(20), 140, 50)
    #b = Body( Circle(100), 300, 600)
    #b.setStatic()
    #Game.bodies.append(b)
    b = Body(Circle(100), 100, 600)
    b.setStatic()
    Game.bodies.append(b)

    b = Body(Circle(20), 200, 350)
    b.setStatic()
    Game.bodies.append(b)

    #Game.target = b

    #b2 = Body( Circle(70), 100, 300)
    #b2 = Body( Circle(90), 50, 150)
    #b2.setStatic()
    #Game.bodies.append(b2)

    #b3 = Body( Circle(70), 200, 400)
    #b3 = Body( Circle(100), 220, 50)
    #b3.setStatic()
    #Game.bodies.append(b3)

    #b4 = Body( Circle(70), 350, 400)
    #b4 = Body( Circle(200), 600, 0)
    #b4.setStatic()
    #Game.bodies.append(b4)

    #verts = [Vec2(-17,10),Vec2(-33,-28),Vec2(-30,50),Vec2(10,20),Vec2(20,40),Vec2(17,-12), Vec2(-30,-10),Vec2(13,44)]

    #b5 = Body( Polygon(verts=verts), 300, 400, math.pi/3 )
    #b5 = Body( Polygon(boxHw=50, boxHh=100), 300, 400, math.pi/3 )
    #b5.shape.setBox(50, 100)
    #b5.setStatic()
    #Game.bodies.append(b5)

    b6 = Body(Polygon(boxHw=260, boxHh=10), 500, 300)
    b6.setOrient(0)
    b6.setStatic()
    Game.bodies.append(b6)
    Game.seasaw = b6
Exemple #29
0
    def test_will_dead_loop(self):
        """
          12345
        1   +++ 
        2   + +
        3   +o+
        """
        body1 = Body(BodyGeometry(3, 3, 1, 1))
        body2 = Body(BodyGeometry(3, 2, 1, 1))
        body3 = Body(BodyGeometry(3, 1, 1, 1))
        body4 = Body(BodyGeometry(4, 1, 1, 1))
        body5 = Body(BodyGeometry(5, 1, 1, 1))
        body6 = Body(BodyGeometry(5, 2, 1, 1))
        body7 = Body(BodyGeometry(5, 3, 1, 1))
        body8 = Body(BodyGeometry(4, 3, 1, 1))
        snake = BaseSnake()
        snake.add_head(body1)
        snake.add_head(body2)
        snake.add_head(body3)
        snake.add_head(body4)
        snake.add_head(body5)
        snake.add_head(body6)
        snake.add_head(body7)
        snake.add_head(body8)

        self.assertFalse(snake.is_will_dead_loop(Direction.DOWN))
        self.assertTrue(snake.is_will_dead_loop(Direction.UP))
Exemple #30
0
def main():
    global total
    print("--- ADVENT OF CODE 2019 DAY 6 ---")

    f = open(args.input, 'r')
    input = f.read()
    orbitList = input.split('\n')

    bodies = {}
    bodies["COM"] = Body()
    for orbit in orbitList:
        name = orbit.split(')')[1]
        bodies[name] = Body()

    for orbit in orbitList:
        o = orbit.split(')')
        outer = o[1]
        inner = o[0]
        bodies[outer].parent = bodies[inner]
        bodies[inner].addChild(bodies[outer])

    # Start counting the orbits from the COM, then output the reults
    countOrbits(bodies["COM"], 1)

    print("PART1: Total number of direct and indirect orbits is %d!" % total)

    # Part 2

    start = bodies["YOU"].parent
    end = bodies["SAN"].parent

    # Find the bodies between santa and the COM
    santaPath = [end]
    current = end
    while current != bodies["COM"]:
        current = current.parent
        santaPath.append(current)

    # Find the first body in santa's path to the COM, climbing up from YOU
    currentLength = 0
    current = start
    while not current in santaPath:
        current = current.parent
        currentLength += 1

    # Print the distance
    total = currentLength + santaPath.index(current)
    print(
        "PART2: Minimal required orbital transfers to get from YOU to SAN is {}!"
        .format(total))