Advertisement
jukaukor

Heittoliike_with_drag_verlet3.py

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