Запрограммируй тир и попади стрелой в мишень. мастер программирования

29 Мар в 19:40
56 +1
0
Ответы
1
Ниже — компактная программа на Python, которая рассчитывает угол(ы) выстрела и моделирует траекторию стрелы (без сопротивления воздуха). Формула для высоты в точке xxx:
y=xtan⁡θ−gx22v2cos⁡2θ 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±v4g(gx2+2yv2) ,
условие существования решения — дискриминант неотрицателен:
Δ=v4−g(gx2+2yv2)≥0. \Delta = v^{4}-g\big(g x^{2}+2 y v^{2}\big) \ge 0.
Δ=v4g(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()
```
Если нужно добавить ветер, сопротивление воздуха или интерактивный ввод — скажите, укажу изменения.
29 Мар в 19:40
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир