Ниже — компактная программа на Python, которая рассчитывает угол(ы) выстрела и моделирует траекторию стрелы (без сопротивления воздуха). Формула для высоты в точке xxx: y=xtanθ−gx22v2cos2θ
y = x\tan\theta - \frac{g x^{2}}{2 v^{2}\cos^{2}\theta} y=xtanθ−2v2cos2θgx2
решение по углу: θ=arctan (v2±v4−g(gx2+2yv2)gx),
\theta = \arctan\!\left(\frac{v^{2}\pm\sqrt{v^{4}-g\big(g x^{2}+2 y v^{2}\big)}}{g x}\right), θ=arctangxv2±v4−g(gx2+2yv2),
условие существования решения — дискриминант неотрицателен: Δ=v4−g(gx2+2yv2)≥0.
\Delta = v^{4}-g\big(g x^{2}+2 y v^{2}\big) \ge 0. Δ=v4−g(gx2+2yv2)≥0. Код (копируйте и запускайте; требует numpy и matplotlib): ``` import math import numpy as np import matplotlib.pyplot as plt def solve_angles(v, x, y, g=9.81): D = v**4 - g*(g*x**2 + 2*y*v**2) if D < 0: return [] # нет решения sqrtD = math.sqrt(D) t1 = math.atan2(v**2 + sqrtD, g*x) t2 = math.atan2(v**2 - sqrtD, g*x) angles = sorted(set([t1, t2])) return angles def trajectory(v, theta, t_max, g=9.81, n=200): t = np.linspace(0, t_max, n) vx = v * math.cos(theta) vy = v * math.sin(theta) x = vx * t y = vy * t - 0.5 * g * t**2 return x, y # Пример входных данных: скорость v (м/с), координата цели x (м), высота цели y (м) v = 30.0 x_target = 40.0 y_target = 0.0 angles = solve_angles(v, x_target, y_target) if not angles: print("Не удаётся поразить мишень при заданной скорости.") else: print("Найденные углы (градусы):", [math.degrees(a) for a in angles]) plt.figure() colors = ['r','b'] for i, th in enumerate(angles): # положим t_max так, чтобы охватить x_target vx = v*math.cos(th) if vx <= 0: continue t_max = (x_target*1.2) / vx xx, yy = trajectory(v, th, t_max) plt.plot(xx, yy, colors[i%len(colors)], label=f'{math.degrees(th):.2f}°') # мишень и земля plt.plot(x_target, y_target, 'go', label='мишень') plt.axhline(0, color='k', linewidth=0.5) plt.xlabel('x (м)') plt.ylabel('y (м)') plt.legend() plt.grid(True) plt.title('Траектории выстрелов') plt.ylim(bottom=min(-1, y_target-1)) plt.xlim(left=0) plt.show() ``` Если нужно добавить ветер, сопротивление воздуха или интерактивный ввод — скажите, укажу изменения.
y=xtanθ−gx22v2cos2θ y = x\tan\theta - \frac{g x^{2}}{2 v^{2}\cos^{2}\theta}
y=xtanθ−2v2cos2θgx2 решение по углу:
θ=arctan (v2±v4−g(gx2+2yv2)gx), \theta = \arctan\!\left(\frac{v^{2}\pm\sqrt{v^{4}-g\big(g x^{2}+2 y v^{2}\big)}}{g x}\right),
θ=arctan gxv2±v4−g(gx2+2yv2) , условие существования решения — дискриминант неотрицателен:
Δ=v4−g(gx2+2yv2)≥0. \Delta = v^{4}-g\big(g x^{2}+2 y v^{2}\big) \ge 0.
Δ=v4−g(gx2+2yv2)≥0.
Код (копируйте и запускайте; требует numpy и matplotlib):
```
import math
import numpy as np
import matplotlib.pyplot as plt
def solve_angles(v, x, y, g=9.81):
D = v**4 - g*(g*x**2 + 2*y*v**2)
if D < 0:
return [] # нет решения
sqrtD = math.sqrt(D)
t1 = math.atan2(v**2 + sqrtD, g*x)
t2 = math.atan2(v**2 - sqrtD, g*x)
angles = sorted(set([t1, t2]))
return angles
def trajectory(v, theta, t_max, g=9.81, n=200):
t = np.linspace(0, t_max, n)
vx = v * math.cos(theta)
vy = v * math.sin(theta)
x = vx * t
y = vy * t - 0.5 * g * t**2
return x, y
# Пример входных данных: скорость v (м/с), координата цели x (м), высота цели y (м)
v = 30.0
x_target = 40.0
y_target = 0.0
angles = solve_angles(v, x_target, y_target)
if not angles:
print("Не удаётся поразить мишень при заданной скорости.")
else:
print("Найденные углы (градусы):", [math.degrees(a) for a in angles])
plt.figure()
colors = ['r','b']
for i, th in enumerate(angles):
# положим t_max так, чтобы охватить x_target
vx = v*math.cos(th)
if vx <= 0:
continue
t_max = (x_target*1.2) / vx
xx, yy = trajectory(v, th, t_max)
plt.plot(xx, yy, colors[i%len(colors)], label=f'{math.degrees(th):.2f}°')
# мишень и земля
plt.plot(x_target, y_target, 'go', label='мишень')
plt.axhline(0, color='k', linewidth=0.5)
plt.xlabel('x (м)')
plt.ylabel('y (м)')
plt.legend()
plt.grid(True)
plt.title('Траектории выстрелов')
plt.ylim(bottom=min(-1, y_target-1))
plt.xlim(left=0)
plt.show()
```
Если нужно добавить ветер, сопротивление воздуха или интерактивный ввод — скажите, укажу изменения.