Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Heittoliikkeen simulointia, mukana ilmanvastus kv²
- # ottaa huomioon ilman tiheyden riippuvuuden korkeudesta y
- # ja lämpötilan riippuvuuden korkeudesta y
- # joten k:n arvo muuttuu korkeuden mukaan
- # a = dv/dt = -g - kv²
- # Juhani Kaukoranta 12.8.2021
- import pygame, math
- # pygame:ssa x kasvaa vasemmalta oikealle, y ylhäältä alas
- 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
- # ilman tiheys roo = 1.225*(288.15/(288.15-0.0065*y))**(-4.25578597)
- k1 = (Cd*A)/(2*m) # pallon vastuskertoimen osa
- # k = k1*roo # pallon vastuskerroin, mukana ilman tiheys roo
- (x0,y0) = (100,500) # lähtöpaikka
- v0 = 200 # lähtönopeus
- g = 9.80665 # putouskiihtyvyys
- alfadeg = 90# 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 = 7000 # animaation kesto 7000*1/100 = 70 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² ja tiheyden korkeusriippuvuus mukana: ")
- (x, y) = (x0, y0) # pallon lähtopaikka, abs korkeus y0
- h = y0 - y # korkeus lähtötasosta
- roo = 1.225*(288.15/(288.15-0.0065*h))**(-4.25578597) # ilman tiheys
- k = k1*roo # pallon ilmanvastuskertoimen aloitusarvo
- 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ökulma = "+str(round(alfadeg))+" Lähtönopeus = "+str(round(v0)), True, yellow, black)
- screen.blit(text,(100,40))
- for j in range (0,T) : # simulointi alkaa
- timer += 1 # puolen sekunnin paikkatietojen tulostusta varten
- x = x + vx*Dt # pallon x-koordinaatti kasvaa
- y = y - vy*Dt # pallon y -kordinaatti kasvaa "ylöspäin" eli arvo pienenee
- if y <= y0:
- h = y0 - y # korkeus lähtötasosta, tarvitaan lämpötilariippuvuuteen
- else:
- h = y - y0
- roo = 1.225*(288.15/(288.15-0.0065*h))**(-4.25578597) # ilman päivitetty tiheys
- k = k1*roo # pallon päivitetty ilmanvastuskerroin
- vx = vx -k*vx**2*Dt # uusi vaakanopeus askeleen Dt kuluttua
- vy = vy - g*Dt - k*vy**2*Dt # uusi pystynopeus askeleen Dt kuluttua, mennään ylös
- (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 > 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))
- screen.blit(text0,(100,120)) # puhdistetaan korkeustiedot
- txt = font.render("Lentoaika = "+str(round(100*j*Dt)/100),True,yellow,black)
- screen.blit(txt,(100,120))
- timer = 0
Add Comment
Please, Sign In to add comment