Advertisement
jukaukor

Heittoliike_drag_verlet.py

Aug 23rd, 2021
48
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.48 KB | None | 0 0
  1. # Heittoliikkeen simulointia, mukana ilmanvastus kv²
  2. # k riippuu ilman tiheydestä, joka riippuvuu korkeudesta ja lämpötilasta
  3. # lämpötila riippuvuu korkeudesta
  4. # joten k:n arvo muuttuu korkeuden mukaan
  5. # a = dv/dt = -g - kv²
  6. # verlet second order method
  7. # Juhani Kaukoranta 23.8.2021
  8. import pygame, math
  9. # pygame:ssa x kasvaa vasemmalta oikealle, y ylhäältä alas
  10. pygame.font.init()
  11. font = pygame.font.Font('freesansbold.ttf', 24)
  12. # pallon ominaisuudet: (otettu baseballista, Cd=0.3)
  13. # ei ilmanvastusta Cd = 0, paraabelirata
  14. Cd = 0.3 # ilmanvastuskerroin, oletusarvo 0.3
  15. roo = 1.225 # ilman tiheys kg/m³ (ICAO, 0m +15C)
  16. A = 0.0043 # pallon poikkipinta-ala m²
  17. m = 0.145 # pallon massa kg
  18. r = 5 # piirretyn pallon säde pikseleinä
  19. # ilman tiheys roo = 1.225*(288.15/(288.15-0.0065*h))**(-4.25578597)
  20. k1 = (Cd*A)/(2*m) # pallon vastuskertoimen osa
  21. # k = k1*roo # pallon vastuskerroin, mukana ilman tiheys roo
  22. v0 = 300 # lähtönopeus
  23. g = 9.80665 # putouskiihtyvyys
  24. alfadeg = 30 # heittokulma (suhteessa vaakatasoon)
  25. alfa = alfadeg*math.pi/180 # heittosuunta radiaaneina
  26. # pystykiihtyvyys y''(t) = -g - k*vy² = -(g+k*vy²)
  27. # vaakakiihtyvyys x''(t) = -k *vx²
  28. t0 = 0.0 # aloitusaika
  29. Dt = 1/100.0 # aika-askel
  30. T = 7000 # animaation kesto 7000*1/100 = 70 s
  31. # piirtoalueen asetus
  32. (width,height) = (1280,720) # Pygamen piirtoala pikseleinä
  33. screen = pygame.display.set_mode((width, height))
  34. black = (0,0,0)
  35. yellow =(255,255,0)
  36. red = (255,0,0)
  37. green = (0,255,0)
  38. blue =(0,0,255)
  39. magenta = (255,0,255)
  40. screen.fill(black)
  41. pygame.display.set_caption("pallon lento, ilmanvastus kv² ja tiheyden korkeusriippuvuus mukana: ")
  42. # pallon (0,0) vastaa Pygamen näytöllä (100,500)
  43. (x0,y0) =(0,0) # pallon koordinaattien aloitusarvot, (0 metriä, 0 metriä)
  44. (pygamex0,pygamey0) = (100,500) # Pygamen koordinaatiston origo
  45. h = 0 # korkeus lähtötasosta tasosta,lähtötaso on merenpinnan taso, Pygamen y=500=gamey0
  46. roo = 1.225*(288.15/(288.15-0.0065*h))**(-4.25578597) # ilman tiheyden alkuarvo
  47. k = k1*roo # pallon ilmanvastuskertoimen aloitusarvo
  48. vx = v0*math.cos(alfa) # vaakasuoran nopeuskomponentin alkuarvo
  49. vy = v0*math.sin(alfa) # pystysuoran nopeuskomponentin alkuarvo
  50. (x1,y1) =(x0 + vx*Dt,y0 + vy*Dt) # eka askel Eulerin avulla
  51. hmax = y1 # pitää kirjaa pallon maksimikorkeudesta
  52. h = y1 # pallon korkeus
  53. timer = 0 # ajastin, 0.5 s välein tulostetaan näytölle pallon dataa
  54. alku =90 # punainen lähtötasoviivan alku pikseleinä vähän ennen lähtöpaikkaa Pygamessa
  55. loppu = 1000 # punaisen lahtötasoviivan loppupistepikseleinä Pygamessa
  56. pygame.draw.line(screen,red,(pygamex0-20,pygamey0+r),(pygamex0+1000,pygamey0+r),2) # vaakaviiva
  57. # piirretty niin, että pallo on vaakaviivalla, keskipiste korkeudella r
  58. text = font.render("Lähtökulma = "+str(round(alfadeg))+" Lähtönopeus = "+str(round(v0)), True, yellow, black)
  59. screen.blit(text,(100,40))
  60. pygame.draw.circle(screen, yellow,(100+x0,500-y0),r) # piirretään pallo
  61. pygame.display.flip() # päivitetään näyttö
  62. pygame.time.delay(2)
  63. pygame.draw.circle(screen,black,(100+x0,500-y0),r) # pallo pois
  64. pygame.draw.circle(screen,yellow,(100+x1,500-y1),r) # piirretään pallo
  65. pygame.display.flip()
  66. pygame.time.delay(2)
  67. pygame.draw.circle(screen,black,(100+x1,500-y1),r) # pallo pois
  68. # simulointi alkaa aikaan T asti
  69. # eka arvojen (x0,y0) ja (x1,y1) jälkeen tulostuu päivitettyjä (x2,y2)
  70. for j in range (0,T) :
  71. timer += 1 # puolen sekunnin paikkatietojen tulostusta varten
  72. x2 = 2*x1 - x0 - (k*vx**2)*Dt**2 # pallon uusi x-koordinaatti
  73. y2 = 2*y1 - y0 - (g + k*vy**2)*Dt**2 # pallon uusi y -kordinaatti
  74. h = y2 # pallon korkeus
  75. if h > hmax:
  76. hmax = h
  77. vx = (x2 - x1)/Dt # päivitetty vaakanopeus
  78. vy = (y2 - y1)/Dt # päivitetty pystynopeus
  79. pygame.draw.circle(screen,yellow,(100+x2,500-y2),r) # piirretään pallo
  80. pygame.display.flip()
  81. pygame.time.delay(2)
  82. (xpaikka,ypaikka) = (round(abs(x2)),round(y2)) # paikka muistiin timer-tulostusta varten
  83. vaakamatka = round(abs(x2)) # muistiin timer-tulostusta varten
  84. korkeus = round(h) # muistiin timer-tulostusta varten
  85. x0 = x1 # askeleen jälkeen päivitetään koordinaatit
  86. x1 = x2
  87. y0 = y1
  88. y1 = y2
  89. roo = 1.225*(288.15/(288.15-0.0065*h))**(-4.25578597) # päivitetty ilman tiheys
  90. k = k1*roo # pallon päivitetty ilmanvastuskerroin
  91. if y2 >= hmax : # pallo lakipisteessä
  92. korkeus = round(h)
  93. korkeustxt0 = font.render("xxxxxxxxxxxxxxxxxxx",True,black,black)
  94. korkeustxt = font.render("maxkorkeus = "+str(korkeus)+" m", True, yellow, black)
  95. screen.blit(korkeustxt0,(100,70)) # puhdistetaan korkeustietoja
  96. screen.blit(korkeustxt,(100,70))
  97. hmax = y2
  98. if y2 < 0 : # pallo putosi maahan
  99. break
  100. pygame.draw.circle(screen, yellow,(100+x2,500-y2),r) # piirretään pallo
  101. pygame.display.flip()
  102. pygame.time.delay(2)
  103. pygame.draw.circle(screen,black,(100+x2,500-y2),r) # edellinen pallon paikka pois
  104. if timer == 50: #puolisekunti kulunut,näytetään paikkatietoja
  105. text0 = font.render("xxxxxxxxxxxxxxxx",True,black,black)
  106. screen.blit(text0,(100,100)) # puhdistetaan vaakamatkatiedot
  107. text = font.render("Vaakamatka = "+str(vaakamatka),True,yellow,black)
  108. screen.blit(text,(100,100))
  109. screen.blit(text0,(100,120)) # puhdistetaan korkeustiedot
  110. txt = font.render("Lentoaika = "+str(round(100*j*Dt)/100),True,yellow,black)
  111. screen.blit(txt,(100,120))
  112. timer = 0
  113.  
  114.  
  115.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement