jukaukor

Heittoliike_with_drag_ver2.py

Aug 12th, 2021 (edited)
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.67 KB | None | 0 0
  1. # Heittoliikkeen simulointia, mukana ilmanvastus kv²
  2. # ottaa huomioon ilman tiheyden riippuvuuden korkeudesta y
  3. # ja lämpötilan riippuvuuden korkeudesta y
  4. # joten k:n arvo muuttuu korkeuden mukaan
  5. # a = dv/dt = -g - kv²
  6. # Juhani Kaukoranta 12.8.2021
  7. import pygame, math
  8. # pygame:ssa x kasvaa vasemmalta oikealle, y ylhäältä alas
  9. pygame.font.init()
  10. font = pygame.font.Font('freesansbold.ttf', 24)
  11. # pallon ominaisuudet: (otettu baseballista, Cd=0.3)
  12. # ei ilmanvastusta Cd = 0, paraabelirata
  13. Cd = 0.3 # ilmanvastuskerroin, oletusarvo 0.3
  14. roo = 1.225 # ilman tiheys kg/m³ (ICAO, 0m +15C)
  15. A = 0.0043 # pallon poikkipinta-ala m²
  16. m = 0.145 # pallon massa kg
  17. r = 5 # piirretyn pallon säde
  18. # ilman tiheys roo = 1.225*(288.15/(288.15-0.0065*y))**(-4.25578597)
  19. k1 = (Cd*A)/(2*m) # pallon vastuskertoimen osa
  20. # k = k1*roo # pallon vastuskerroin, mukana ilman tiheys roo
  21. (x0,y0) = (100,500) # lähtöpaikka
  22. v0 = 200 # lähtönopeus
  23. g = 9.80665 # putouskiihtyvyys
  24. alfadeg = 90# 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)
  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. (x, y) = (x0, y0) # pallon lähtopaikka, abs korkeus y0
  43. h = y0 - y # korkeus lähtötasosta
  44. roo = 1.225*(288.15/(288.15-0.0065*h))**(-4.25578597) # ilman tiheys
  45. k = k1*roo # pallon ilmanvastuskertoimen aloitusarvo
  46. vx = v0*math.cos(alfa) # vaakasuoran nopeuskomponentin alkuarvo
  47. vy = v0*math.sin(alfa) # pystysuoran nopeuskomponentin alkuarvo
  48. #ax = -k * vx**2 # vaakakiihtyvyyden aloitusarvo
  49. #ay = -g - k*vy**2 # pystykiihtyvyyden aloitusarvo
  50. ymax = y0 # pallon maksimikorkeuden aloitusarvo (tässä pienin lukema ylhäällä)
  51. timer = 0 # ajastin, 1 s välein tulostetaan suunta
  52. alku =x0-10 # punainen viiva alkaa vähän ennen lähtöpaikkaa
  53. loppu = x0+800 # viivan loppupiste
  54. maassa = y0+r # pallo punaviivalla
  55. pygame.draw.line(screen,red,(alku,y0+10),(loppu,y0+10),2) # vaakaviiva lähtöpaika
  56. text = font.render("Lähtökulma = "+str(round(alfadeg))+" Lähtönopeus = "+str(round(v0)), True, yellow, black)
  57. screen.blit(text,(100,40))
  58. for j in range (0,T) : # simulointi alkaa
  59. timer += 1 # puolen sekunnin paikkatietojen tulostusta varten
  60. x = x + vx*Dt # pallon x-koordinaatti kasvaa
  61. y = y - vy*Dt # pallon y -kordinaatti kasvaa "ylöspäin" eli arvo pienenee
  62. if y <= y0:
  63. h = y0 - y # korkeus lähtötasosta, tarvitaan lämpötilariippuvuuteen
  64. else:
  65. h = y - y0
  66. roo = 1.225*(288.15/(288.15-0.0065*h))**(-4.25578597) # ilman päivitetty tiheys
  67. k = k1*roo # pallon päivitetty ilmanvastuskerroin
  68. vx = vx -k*vx**2*Dt # uusi vaakanopeus askeleen Dt kuluttua
  69. vy = vy - g*Dt - k*vy**2*Dt # uusi pystynopeus askeleen Dt kuluttua, mennään ylös
  70. (xpaikka,ypaikka) = (round(x),round(y)) # paikka muistiin timer-tulostusta varten
  71. vaakamatka = round(abs(x-x0)) # muistiin timer-tulostusta varten
  72. korkeus = round(abs(y0 - y)) # muistiin timer-tulostusta varten
  73. if y < ymax : # kuula lakipisteessä
  74. korkeus = round(abs(y0 - ymax))
  75. korkeustxt0 = font.render("xxxxxxxxxxxxxxxxxxx",True,black,black)
  76. korkeustxt = font.render("maxkorkeus = "+str(korkeus)+" m", True, yellow, black)
  77. screen.blit(korkeustxt0,(100,70)) # puhdistetaan korkeustietoja
  78. screen.blit(korkeustxt,(100,70))
  79. ymax = y
  80. if x > alku and x < loppu and y > maassa : # pallo putosi punaiselle viivalle
  81. break
  82. pygame.draw.circle(screen, yellow,(x,y),r) # piirretään pallo
  83. pygame.display.flip()
  84. # mitä pienempi viive, sitä nopeampi liike
  85. pygame.time.delay(2)
  86. pygame.draw.circle(screen,black,(x,y),r) # edellinen pallon paikka pois
  87. if timer == 50: #puolisekunti kulunut,näytetään paikkatietoja
  88. text0 = font.render("xxxxxxxxxxxxxxxx",True,black,black)
  89. screen.blit(text0,(100,100)) # puhdistetaan vaakamatkatiedot
  90. text = font.render("Vaakamatka = "+str(vaakamatka),True,yellow,black)
  91. screen.blit(text,(100,100))
  92. screen.blit(text0,(100,120)) # puhdistetaan korkeustiedot
  93. txt = font.render("Lentoaika = "+str(round(100*j*Dt)/100),True,yellow,black)
  94. screen.blit(txt,(100,120))
  95. timer = 0
  96.  
  97.  
  98.  
  99.  
  100.  
  101.  
  102.  
  103.  
  104.  
  105.  
  106.  
  107.  
  108.  
  109.  
  110.  
  111.  
  112.  
  113.  
  114.  
  115.  
  116.  
  117.  
  118.  
  119.  
Add Comment
Please, Sign In to add comment