Simulering med pygame 4

Svingningar

I forrige leksjon såg vi på bevegelse i tyngdefeltet der vi har konstant akselerasjon i y-retning. Denne gongen skal vi sjå på svingningar i horisontalplanet. Så vi tenkjer oss at vi har eit lodd som glir friksjonsfritt på underlaget. Loddet er påvirka av tre krefter: tyngdekraften, normalkrafta frå underlaget, og fjørkrafta. Dei to første er like store, men motsatt retta, og dermed står vi igjen med fjørkrafta. Denne krafta er på formen F = -kx, der k er fjørkonstanten. Newtons andre lov gir då at ma = -ku, eller a = - Cu, der konstanten C = k/m, og u er utslaget, dvs. avstanden frå likevektspunktet. Så den vesentlige forskjellen frå forrige leksjon er at her må vi først rekna ut a, før vi reknar ut farten a, og posisjonen x. Så vi gjer følgande utrekningar:

In [ ]:
        u = x - x0 # Utslaget
        ax = -C*u # Finn akselerasjonen i x-retning
        vx += ax # Oppdaterer farten i x-retning
        x += vx # Oppdaterer x-koordinat

Her er x0 likevektspunktet, dvs. det punktet som loddet svingar om. Vi set det lik midten av vinduet. Vi har kun behov for å rekna ut akselerasjonen i x-retningm sidan det jo ikkje er bevegelse i y-retning. y set vi lik ein konstant. Resten av koden handlar om å tegna ei "fjør" (som vi bare tegnar som ein rett strek) og eit feste for denne. Festet er bare for figuren, og vi lar det stå (litt tilfeldig) på x-verdien 100. Så tegnar vi også bakken under, og ein raud strek som viser likevektspunktet. Resten er mykje som før, og koden er som følger:

In [ ]:
import pygame
pygame.display.init() # Startar pygame

BREDDE = 700 # Bredden på vinduet
HOYDE = 400 # Høyden på vinduet

# Definerer RGB-fargar
BAKGRUNN =  (100, 200, 255)
BALL = (255, 80, 0)
BAKKE = (0,0,0)
TAU = (0,100,0)
MIDT = (100,0,0)

FPS = 200 #Frames Per Second, dvs kor fort animasjonen skal gå.

vindu = pygame.display.set_mode((BREDDE, HOYDE)) # Definerer vindu / overflate
pygame.display.set_caption("Svingning: ") # Overskrift for vinduet
clock = pygame.time.Clock()

def game_loop():
   
    R = 15          # Radius
    
    x = 500         # startverdi for x
    M = BREDDE/2    # Midten
    y = 250         # Startverdi for y
    vx = 0          # Startfart i x-retning
    C = 0.001       # k / m (Fjørkonstant / masse)

    feste = 100

    running = True # Boolsk variabel. Løkka vil løpa så lenge denne er SANN

    while running:
        
        # Lukker vindu og stoppar programmet:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                return pygame.quit()
       
        feste = 100 # x-verdien til festepunktet
        x0 = M # Likevektspunkt i midten
        u = x - x0 # Utslaget
        ax = -C*u # Finn akselerasjonen i x-retning
        vx += ax # Oppdaterer farten i x-retning
        x += vx # Oppdaterer x-koordinat

        # Tegnar vindu og ball
        vindu.fill(BAKGRUNN) # Fyller vindu med ein farge
        pygame.draw.circle(vindu, BALL, (int(x), int(y)), R, 0)
        pygame.draw.lines(vindu, TAU, False, [(feste,y), (x-R,y)], 2) # "Strikken"
        pygame.draw.lines(vindu, TAU, False, [(feste,y-R), (feste,y+R)], 5) # Feste til strikken
        pygame.draw.lines(vindu, MIDT, False, [(M,y+2*R), (350,y+3*R)], 2) # Markør for midten
        pygame.draw.lines(vindu, BAKKE, False, [(0,y+R+4), (BREDDE,y+R+4)], 10) # "Bakken"
        pygame.display.update()
        clock.tick(FPS)

game_loop()