График движения снаряда Python дает мне прямую линию

Вот код, который должен вычислять движение, но он создает линию вместо параболы, любая помощь приветствуется.

import math as m
import matplotlib.pyplot as plt
import numpy as np

class Projectile_motion:
    def __init__(self, V_x, V_y, g, delta_time):
        self.gravity = g
        self.V_x = V_x
        self.V_y = V_y
        self.delta_time = delta_time

    def velocity(self, angle):
        self.angle = angle
        self.V_x= m.ceil(self.V_x *m.cos(self.angle))
        self.V_y = m.ceil((self.V_y * m.sin(self.angle))) - (self.gravity * self.delta_time)

    def distance(self, x, y):
        self.x = x
        self.y = y
        self.x = self.x + (self.V_x * self.delta_time)
        self.y = self.y + (self.V_y * m.sin(self.angle)) + (0.5 * self.gravity * ((self.delta_time)**2))
        return self.x, self.y


ww = np.linspace(0, 50, num=5)
for i in ww:
    attempt1 = Projectile_motion(30, 30, 9.8, i)
    attempt1.velocity(1.042)
    ss=attempt1.distance(0, 0)
plt.plot(ss)
plt.show()

Вывод:


person simon    schedule 18.06.2020    source источник
comment
Для лучшей читабельности, не могли бы вы обновить свой вопрос, отделив фрагменты кода от другого контекста? руководство по уценке.   -  person quirkystack    schedule 19.06.2020


Ответы (1)


У вас хорошее начало, но вам нужно подчистить некоторые физические аспекты вашей модели.

Если у вас есть V_x и V_y, неясно, что вы делаете с углом, потому что он уже определен отношением V_x и V_y.

Я бы посоветовал вам избавиться от угла для начала. Затем вам просто нужно сделать пару вещей с V_y:

  1. Обновляйте V_y несколько раз во время работы. Гравитация должна увеличиваться В_у, верно? Щас твой В_й не обновляется. Оно должно увеличиться на 9,8 м/с^2, так что это ваше обновление каждый раз.
  2. Используйте этот обновленный V_y для расчета расстояния. Итак, после обновления V_y просто используйте его для изменения позиции y. Вы не должны больше заниматься математикой, просто y += V_y*dt

Если у вас это получится, вы можете вернуться к использованию угла (который, как я предполагаю, является вашим начальным направлением) и вычислить V_x и V_y стандартным применением косинуса и синуса к углу. Кроме того, помните, что математическому модулю нужны угловые входные данные в радианах.

person AirSquid    schedule 19.06.2020
comment
спасибо за ответ, я попытаюсь снова, я думаю, что физический аспект смутил меня, поэтому я боролся, еще раз спасибо - person simon; 20.06.2020