Advertisement
Guest User

Untitled

a guest
Mar 25th, 2019
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.28 KB | None | 0 0
  1. from sympy.solvers import solve
  2. from sympy import Symbol
  3. import numpy as np
  4. import matplotlib.pyplot as plt
  5.  
  6. def maksymalnaWysokosc(voy, g):
  7. hmax = (voy**2)/(2*g)
  8.  
  9. return round(hmax, 3)
  10.  
  11. def czasCalkowity(voy, g):
  12. tC = (2 * voy) / g
  13.  
  14. return tC
  15.  
  16. def czasLotu(pkX, vox, dzialo):
  17. czasLotu = (pkX - dzialo[0])/vox
  18.  
  19. return czasLotu
  20.  
  21. def wyznaczKierunekStrzalu(vox):
  22. if vox >= 0:
  23. kierunekStrzalu = 'prawo'
  24. else:
  25. kierunekStrzalu = 'lewo'
  26.  
  27. return kierunekStrzalu
  28.  
  29. def polozeniaPociskuOdCzasu(tL, czasy, dzialo, vox, voy, g):
  30. polozeniaPocisku = []
  31. for t in czasy:
  32. if t<=tL:
  33. pociskX = vox*t + dzialo[0]
  34. pociskY = voy*t - (g*t**2)/2 + dzialo[1]
  35. polozeniaPocisku.append((round(pociskX, 3), round(pociskY, 3)))
  36. else:
  37. polozeniaPocisku.append((0, 0))
  38.  
  39. return polozeniaPocisku
  40.  
  41. def predkosciPociskuodCzasu(tL, tC, czasy, vox, voy, g):
  42. predkosciPocisku = []
  43. for t in czasy:
  44. if t<=tL:
  45. if t <= 0.5 * tC:
  46. vX = vox
  47. vY = -g * t + voy
  48. else:
  49. vX = vox
  50. vY = g * (t - 0.5 * tC)
  51. predkosciPocisku.append((round(vX, 3), round(vY, 3)))
  52. else:
  53. predkosciPocisku.append((0, 0))
  54.  
  55. return predkosciPocisku
  56.  
  57. def czyPociskTrafiłWCel(polozenieKoncowePocisku, cel):
  58. if abs(polozenieKoncowePocisku[0] - cel[0]) <= 0.05 and abs(polozenieKoncowePocisku[1] - cel[1]) <= 0.05:
  59. return 1
  60. else:
  61. return 0
  62.  
  63. def rozkladFunkcjiTerenu(terenString):
  64. terenString = terenString.split()
  65.  
  66. if terenString[0][0] != "-":
  67. terenString.insert(0, "+")
  68.  
  69. indeks = 0
  70. wyrazenie = []
  71. znak = []
  72. for tekst in terenString:
  73. if indeks%2 != 0:
  74. wyrazenie.append(tekst)
  75. else:
  76. znak.append(tekst)
  77. indeks += 1
  78.  
  79. terenPodzielony = []
  80. for numer, wyraz in enumerate(wyrazenie):
  81. wyraz = wyraz.split("x")
  82.  
  83. # sytuacja x^0
  84. if len(wyraz) == 1:
  85. wyraz.append('^0')
  86.  
  87. # sytuacja x^1
  88. if wyraz[0] == '':
  89. wyraz[0] = '1.0'
  90.  
  91. # sytaucja a * x^1
  92. if len(wyraz) == 2:
  93. if wyraz[1] == '':
  94. wyraz[1] = '^1'
  95.  
  96. rozdzielonyWyraz = ([znak[numer], wyraz[0], wyraz[1][1]])
  97. terenPodzielony.append(rozdzielonyWyraz)
  98.  
  99. return terenPodzielony
  100.  
  101. def zmianaTypuFunkcjiTerenu(terenPodzielony):
  102. x = Symbol('x', real=True)
  103. terenRownanie = 0
  104. for wyraz in terenPodzielony:
  105.  
  106. wyraz[1] = float(wyraz[1])
  107. wyraz[2] = int(wyraz[2])
  108.  
  109. if wyraz[0] == '-':
  110. wyraz[1] *= (-1)
  111.  
  112. terenRownanie += wyraz[1] * x**wyraz[2]
  113.  
  114. return terenRownanie
  115.  
  116. def wyznaczRownaniePolozeniaPocisku(vox, voy, g, dzialo):
  117. x = Symbol('x', real=True)
  118. rownaniePolozeniaPocisku = (voy/vox)*(x - dzialo[0]) - (g/(2*vox**2))*(x - dzialo[0])**2 + dzialo[1]
  119.  
  120. return rownaniePolozeniaPocisku
  121.  
  122. def polozenieKoncowePociskuX(rownaniePolozeniaPocisku, terenRownanie, kierunekStrzalu):
  123. x = Symbol('x', real=True)
  124. PolozeniaKoncowegoPociskuX = solve(rownaniePolozeniaPocisku - terenRownanie, x)
  125. if kierunekStrzalu == 'prawo':
  126. return PolozeniaKoncowegoPociskuX[1]
  127. else:
  128. return PolozeniaKoncowegoPociskuX[-2]
  129.  
  130. def polozenieKoncowePocisku(pkX, vox, voy, g, dzialo):
  131. polozenieKoncowePociskuY = (voy/vox) * (pkX - dzialo[0]) - (g/(2*vox**2))*(pkX - dzialo[0])**2 + dzialo[1]
  132.  
  133. return pkX, polozenieKoncowePociskuY
  134.  
  135. def zmianaFormatuDanych(wyraz):
  136. wyraz = wyraz.split(', ')
  137. wyraz1 = wyraz[0][1:]
  138. wyraz2 = wyraz[1][:-1]
  139.  
  140. return float(wyraz1), float(wyraz2)
  141.  
  142. def pobranieDanych(linia):
  143. linia = linia.split('; ')
  144.  
  145. # współrzędne działa
  146. dzialo = zmianaFormatuDanych(linia[0])
  147. # print("Działo: ", dzialo[0], dzialo[1])
  148.  
  149. # współrzędne celu
  150. cel = zmianaFormatuDanych(linia[1])
  151. # print("Cel: ", cel[0], cel[1])
  152.  
  153. # wektor prędkości początkowej
  154. voox, vooy = zmianaFormatuDanych(linia[2])
  155. # print("Prędkość początkowa: ", voox, vooy)
  156.  
  157. # wiatr
  158. wx, wy = zmianaFormatuDanych(linia[3])
  159. # print("Wiatr: ", wx, wy)
  160.  
  161. # czasy
  162. czasy = []
  163. czasy.append(float(linia[4]))
  164. czasy.append(float(linia[5]))
  165. czasy.append(float(linia[6]))
  166. # print("Czasy: ", czasy)
  167.  
  168. # funkcja definiująca ukształtowanie terenu
  169. terenString = linia[7]
  170. # print("funkcja definiująca ukształtowanie terenu: ", terenString)
  171.  
  172. return dzialo, cel, voox, vooy, wx, wy, czasy, terenString
  173.  
  174. def punktyNaWykresie(dzialo, cel, pkPocisku):
  175. plt.plot(dzialo[0], dzialo[1], "*", markerfacecolor="#f20068", markeredgecolor="#990064",
  176. markersize=15, zorder=10, label="Działo")
  177. plt.plot(cel[0], cel[1], "^", markerfacecolor="#ff0000", markeredgecolor="#ab0000", markersize=15, zorder=10, label="Cel")
  178.  
  179. plt.plot(pkPocisku[0], pkPocisku[1], "*", markerfacecolor="#abbf00", markeredgecolor="#6eb503", markersize=20, zorder=10, label="Punkt uderzenia")
  180.  
  181. def trajektoriaLotuNaWykresie(dzialo, vox, voy, g, pkPocisku, hmax):
  182. x = np.arange(dzialo[0], pkPocisku[0], 0.001)
  183. rownanie = (voy/vox)*(x - dzialo[0]) - (g/(2*vox**2))*(x - dzialo[0])**2 + dzialo[1]
  184. plt.plot(x, rownanie)
  185.  
  186.  
  187. def terenNaWykresie(dzialo, cel, pkPocisku, terenString):
  188. x = np.arange(dzialo[0]-0.2, max(cel[0], pkPocisku[0])+0.2, 0.001)
  189. # zawał
  190. terenPodzielony = rozkladFunkcjiTerenu(terenString)
  191. terenRownanie = zmianaTypuFunkcjiTerenu(terenPodzielony)
  192.  
  193. plt.plot(x, 0.3*x**4 + 0.2*x**3 - 0.3*x**2 + 0.2)
  194. # plt.plot(x, terenRownanie)
  195. # przerwa w zawale
  196.  
  197. def wizualizacjaWykresow(dzialo, cel, pkPocisku, vox, voy, g, hmax, terenString):
  198.  
  199. punktyNaWykresie(dzialo, cel, pkPocisku)
  200. trajektoriaLotuNaWykresie(dzialo, vox, voy, g, pkPocisku, hmax)
  201. terenNaWykresie(dzialo, cel, pkPocisku, terenString)
  202.  
  203. plt.ylim(top=1.5 * hmax)
  204.  
  205. xlimMAX = round(max(cel[0], pkPocisku[0])+0.2, 2)
  206. plt.xlim(dzialo[0]-0.2, xlimMAX)
  207.  
  208. OX = plt.gca()
  209. OX.legend()
  210.  
  211. plt.show()
  212.  
  213.  
  214.  
  215.  
  216. def przygotujDaneWyjsciowe(pkPocisku, hmax, predkosciPocisku, hit):
  217. liniaWyjsciowa = ""
  218.  
  219. liniaWyjsciowa += "(" + str(round(pkPocisku[0], 3)) + ", " + str(round(pkPocisku[1], 3)) + "); "
  220. liniaWyjsciowa += str(hmax) + "; "
  221. liniaWyjsciowa += "("
  222.  
  223. for i in range(0, 3):
  224. liniaWyjsciowa += "[" + str(predkosciPocisku[i][0]) + ", " + str(predkosciPocisku[i][1]) + "]"
  225. if i != 2:
  226. liniaWyjsciowa += ", "
  227. liniaWyjsciowa += "); " + str(hit) + "\n"
  228. return liniaWyjsciowa
  229.  
  230. def main():
  231. g = 9.81
  232.  
  233. with open("input.txt", "r") as plik_input:
  234. with open("output.txt", "w+") as plik_output:
  235. for linia in plik_input:
  236. dzialo, cel, voox, vooy, wx, wy, czasy, terenString = pobranieDanych(linia)
  237.  
  238. vox, voy = voox + wx, vooy + wy
  239. kierunekStrzalu = wyznaczKierunekStrzalu(vox)
  240.  
  241. rownaniePolozeniaPocisku = wyznaczRownaniePolozeniaPocisku(vox, voy, g, dzialo)
  242. terenPodzielony = rozkladFunkcjiTerenu(terenString)
  243. terenRownanie = zmianaTypuFunkcjiTerenu(terenPodzielony)
  244.  
  245. pkX = polozenieKoncowePociskuX(rownaniePolozeniaPocisku, terenRownanie, kierunekStrzalu)
  246. tC = czasCalkowity(voy, g)
  247. tL = czasLotu(pkX, vox, dzialo)
  248. hmax = maksymalnaWysokosc(voy, g)
  249. predkosciPocisku = predkosciPociskuodCzasu(tL, tC, czasy, vox, voy, g)
  250. pkPocisku = polozenieKoncowePocisku(pkX, vox, voy, g, dzialo)
  251. hit = czyPociskTrafiłWCel(pkPocisku, cel)
  252.  
  253.  
  254.  
  255. # punktyNaWykresie(dzialo, cel, pkPocisku)
  256. # trajektoriaLotuNaWykresie(dzialo, vox, voy, g, pkPocisku, hmax)
  257. # terenNaWykresie(dzialo, pkPocisku, terenString)
  258. # plt.show()
  259.  
  260. wyjciowaLinia = przygotujDaneWyjsciowe(pkPocisku, hmax, predkosciPocisku, hit)
  261. # print(wyjciowaLinia)
  262. # plik_output.write
  263.  
  264. wizualizacjaWykresow(dzialo, cel, pkPocisku, vox, voy, g, hmax, terenString)
  265.  
  266.  
  267.  
  268. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement