Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Heittoliikkeen simulointia, mukana ilmanvastus kv²
- # a = dv/dt = -g - kv²
- # Juhani Kaukoranta 11.8.2021
- import pygame, math
- pygame.font.init()
- font = pygame.font.Font('freesansbold.ttf', 24)
- # pallon ominaisuudet: (otettu baseballista, Cd=0.3)
- # ei ilmanvastusta Cd = 0, paraabelirata
- Cd = 0.3 # ilmanvastuskerroin, oletusarvo 0.3
- roo = 1.225 # ilman tiheys kg/m³ (ICAO, 0m +15C)
- A = 0.0043 # pallon poikkipinta-ala m²
- m = 0.145 # pallon massa kg
- r = 5 # piirretyn pallon säde
- k = (Cd*roo*A)/(2*m) # pallon koottu vastuskerroin
- (x0,y0) = (100,500) # lähtöpaikka
- v0 = 300 # lähtönopeus
- g = 9.81 # putouskiihtyvyys
- alfadeg = 30# heittokulma (suhteessa vaakatasoon)
- alfa = alfadeg*math.pi/180 # heittosuunta radiaaneina
- # pystykiihtyvyys y''(t) = -g - k*vy² = -(g+k*vy²)
- # vaakakiihtyvyys x''(t) = -k *vx²
- t0 = 0.0 # aloitusaika
- Dt = 1/100.0 # aika-askel
- T = 6000 # animaation kesto 6000*1/100 = 60 s
- # piirtoalueen asetus
- (width,height) = (1280,720)
- screen = pygame.display.set_mode((width, height))
- black = (0,0,0)
- yellow =(255,255,0)
- red = (255,0,0)
- green = (0,255,0)
- blue =(0,0,255)
- magenta = (255,0,255)
- screen.fill(black)
- pygame.display.set_caption("pallon lento, ilmanvastus kv² mukana: ")
- (x, y) = (x0, y0) # pallon lähtopaikka
- vx = v0*math.cos(alfa) # vaakasuoran nopeuskomponentin alkuarvo
- vy = v0*math.sin(alfa) # pystysuoran nopeuskomponentin alkuarvo
- ax = -k * vx**2 # vaakakiihtyvyyden aloitusarvo
- ay = -g - k*vy**2 # pystykiihtyvyyden aloitusarvo
- ymax = y0 # pallon maksimikorkeuden aloitusarvo (tässä pienin lukema ylhäällä)
- timer = 0 # ajastin, 1 s välein tulostetaan suunta
- alku =x0-10 # punainen viiva alkaa vähän ennen lähtöpaikkaa
- loppu = x0+800 # viivan loppupiste
- maassa = y0+r # pallo punaviivalla
- pygame.draw.line(screen,red,(alku,y0+10),(loppu,y0+10),2) # vaakaviiva lähtöpaika
- text = font.render("Lähtöpaikka = ( "+str(x0)+" , "+str(y)+" )", True, yellow, black)
- screen.blit(text,(100,40))
- for j in range (0,T) : # simulointi alkaa
- timer += 1
- x = x + vx*Dt # pallon x-koordinaatti
- y = y - vy*Dt # pallon y -kordinaatti
- vx = vx -k*vx**2*Dt # uusi vaakanopeus askeleen Dt kuluttua
- vy = vy - (g + k*vy**2)*Dt # uusi pystynopeus askeleen Dt kuluttua
- (xpaikka,ypaikka) = (round(x),round(y)) # paikka muistiin timer-tulostusta varten
- vaakamatka = round(abs(x-x0)) # muistiin timer-tulostusta varten
- korkeus = round(abs(y0 - y)) # muistiin timer-tulostusta varten
- if y < ymax : # kuula lakipisteessä
- korkeus = round(abs(y0 - ymax))
- korkeustxt0 = font.render("xxxxxxxxxxxxxxxxxxx",True,black,black)
- korkeustxt = font.render("maxkorkeus = "+str(korkeus)+" m", True, yellow, black)
- screen.blit(korkeustxt0,(100,70)) # puhdistetaan korkeustietoja
- screen.blit(korkeustxt,(100,70))
- ymax = y
- if x > width or y< 0: # pallo pysähtyy yläreunaan tai oikeaan reunaan
- break
- if x < 0 or y > height: # pallo pysähtyy vasempaan reunaan tai alareunaan
- break
- if x > alku and x < loppu and y > maassa : # pallo putosi punaiselle viivalle
- break
- pygame.draw.circle(screen, yellow,(x,y),r) # piirretään pallo
- pygame.display.flip()
- # mitä pienempi viive, sitä nopeampi liike
- pygame.time.delay(2)
- pygame.draw.circle(screen,black,(x,y),r) # edellinen pallon paikka pois
- if timer == 50: #puolisekunti kulunut,näytetään paikkatietoja
- text0 = font.render("xxxxxxxxxxxxxxxx",True,black,black)
- screen.blit(text0,(100,100)) # puhdistetaan vaakamatkatiedot
- text = font.render("Vaakamatka = "+str(vaakamatka),True,yellow,black)
- screen.blit(text,(100,100))
- timer = 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement