Advertisement
jukaukor

Heittoliike_with_drags.py

Aug 11th, 2021
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.68 KB | None | 0 0
  1. # Heittoliikkeen simulointia, mukana ilmanvastus kv²
  2. # a = dv/dt = -g - kv²
  3. # Juhani Kaukoranta 11.8.2021
  4. import pygame, math
  5. pygame.font.init()
  6. font = pygame.font.Font('freesansbold.ttf', 24)
  7. # pallon ominaisuudet: (otettu baseballista, Cd=0.3)
  8. # ei ilmanvastusta Cd = 0, paraabelirata
  9. Cd = 0.3 # ilmanvastuskerroin, oletusarvo 0.3
  10. roo = 1.225 # ilman tiheys kg/m³ (ICAO, 0m +15C)
  11. A = 0.0043 # pallon poikkipinta-ala m²
  12. m = 0.145 # pallon massa kg
  13. r = 5 # piirretyn pallon säde
  14. k = (Cd*roo*A)/(2*m) # pallon koottu vastuskerroin
  15. (x0,y0) = (100,500) # lähtöpaikka
  16. v0 = 300 # lähtönopeus
  17. g = 9.81 # putouskiihtyvyys
  18. alfadeg = 30# heittokulma (suhteessa vaakatasoon)
  19. alfa = alfadeg*math.pi/180 # heittosuunta radiaaneina
  20. # pystykiihtyvyys y''(t) = -g - k*vy² = -(g+k*vy²)
  21. # vaakakiihtyvyys x''(t) = -k *vx²
  22. t0 = 0.0 # aloitusaika
  23. Dt = 1/100.0 # aika-askel
  24. T = 6000 # animaation kesto 6000*1/100 = 60 s
  25. # piirtoalueen asetus
  26. (width,height) = (1280,720)
  27. screen = pygame.display.set_mode((width, height))
  28. black = (0,0,0)
  29. yellow =(255,255,0)
  30. red = (255,0,0)
  31. green = (0,255,0)
  32. blue =(0,0,255)
  33. magenta = (255,0,255)
  34. screen.fill(black)
  35. pygame.display.set_caption("pallon lento, ilmanvastus kv² mukana: ")
  36. (x, y) = (x0, y0) # pallon lähtopaikka
  37. vx = v0*math.cos(alfa) # vaakasuoran nopeuskomponentin alkuarvo
  38. vy = v0*math.sin(alfa) # pystysuoran nopeuskomponentin alkuarvo
  39. ax = -k * vx**2 # vaakakiihtyvyyden aloitusarvo
  40. ay = -g - k*vy**2 # pystykiihtyvyyden aloitusarvo
  41. ymax = y0 # pallon maksimikorkeuden aloitusarvo (tässä pienin lukema ylhäällä)
  42. timer = 0 # ajastin, 1 s välein tulostetaan suunta
  43. alku =x0-10 # punainen viiva alkaa vähän ennen lähtöpaikkaa
  44. loppu = x0+800 # viivan loppupiste
  45. maassa = y0+r # pallo punaviivalla
  46. pygame.draw.line(screen,red,(alku,y0+10),(loppu,y0+10),2) # vaakaviiva lähtöpaika
  47. text = font.render("Lähtöpaikka = ( "+str(x0)+" , "+str(y)+" )", True, yellow, black)
  48. screen.blit(text,(100,40))
  49. for j in range (0,T) : # simulointi alkaa
  50. timer += 1
  51. x = x + vx*Dt # pallon x-koordinaatti
  52. y = y - vy*Dt # pallon y -kordinaatti
  53. vx = vx -k*vx**2*Dt # uusi vaakanopeus askeleen Dt kuluttua
  54. vy = vy - (g + k*vy**2)*Dt # uusi pystynopeus askeleen Dt kuluttua
  55. (xpaikka,ypaikka) = (round(x),round(y)) # paikka muistiin timer-tulostusta varten
  56. vaakamatka = round(abs(x-x0)) # muistiin timer-tulostusta varten
  57. korkeus = round(abs(y0 - y)) # muistiin timer-tulostusta varten
  58. if y < ymax : # kuula lakipisteessä
  59. korkeus = round(abs(y0 - ymax))
  60. korkeustxt0 = font.render("xxxxxxxxxxxxxxxxxxx",True,black,black)
  61. korkeustxt = font.render("maxkorkeus = "+str(korkeus)+" m", True, yellow, black)
  62. screen.blit(korkeustxt0,(100,70)) # puhdistetaan korkeustietoja
  63. screen.blit(korkeustxt,(100,70))
  64. ymax = y
  65. if x > width or y< 0: # pallo pysähtyy yläreunaan tai oikeaan reunaan
  66. break
  67. if x < 0 or y > height: # pallo pysähtyy vasempaan reunaan tai alareunaan
  68. break
  69. if x > alku and x < loppu and y > maassa : # pallo putosi punaiselle viivalle
  70. break
  71. pygame.draw.circle(screen, yellow,(x,y),r) # piirretään pallo
  72. pygame.display.flip()
  73. # mitä pienempi viive, sitä nopeampi liike
  74. pygame.time.delay(2)
  75. pygame.draw.circle(screen,black,(x,y),r) # edellinen pallon paikka pois
  76. if timer == 50: #puolisekunti kulunut,näytetään paikkatietoja
  77. text0 = font.render("xxxxxxxxxxxxxxxx",True,black,black)
  78. screen.blit(text0,(100,100)) # puhdistetaan vaakamatkatiedot
  79. text = font.render("Vaakamatka = "+str(vaakamatka),True,yellow,black)
  80. screen.blit(text,(100,100))
  81. timer = 0
  82.  
  83.  
  84.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement