#python
#python
Вопрос:
Я учусь использовать методы из книги, и в этом упражнении я пытаюсь найти максимальную высоту снаряда. Я почти уверен, что правильно сформулировал уравнение в projectile.py , но каждый раз, когда я выполняю упражнение 1.py результат, который я cball.getMaxY()
всегда получаю "-0.0 meters."
, таков: Какие простые вещи я, возможно, пропустил?
# projectile.py
"""projectile.py
Provides a simple class for modeling the
flight of projectiles."""
from math import sin, cos, radians
class Projectile:
"""Simulates the flight of simple projectiles near the earth's
surface, ignoring wind resistance. Tracking is done in two
dimensions, height (y) and distance (x)."""
def __init__(self, angle, velocity, height):
"""Create a projectile with given launch angle, initial
velocity and height."""
self.xpos = 0.0
self.ypos = height
theta = radians(angle)
self.xvel = velocity * cos(theta)
self.yvel = velocity * sin(theta)
#Find time to reach projectile's maximum height
self.th = self.yvel/9.8
def update(self, time):
"""Update the state of this projectile to move it time seconds
farther into its flight"""
#Find max height
self.maxypos = self.yvel - (9.8 * self.th)
self.xpos = self.xpos time * self.xvel
yvel1 = self.yvel - 9.8 * time
self.ypos = self.ypos time * (self.yvel yvel1) / 2.0
self.yvel = yvel1
def getY(self):
"Returns the y position (height) of this projectile."
return self.ypos
def getX(self):
"Returns the x position (distance) of this projectile."
return self.xpos
def getMaxY(self):
"Returns the maximum height of the projectile."
return self.maxypos
# Exercise 1.py
from projectile import Projectile
def getInputs():
a = eval(input("Enter the launch angle (in degrees): "))
v = eval(input("Enter the initial velocity (in meters/sec): "))
h = eval(input("Enter the initial height (in meters): "))
t = eval(input("Enter the time interval between position calculations: "))
return a,v,h,t
def main():
angle, vel, h0, time = getInputs()
cball = Projectile(angle, vel, h0)
while cball.getY() >= 0:
cball.update(time)
print("nDistance traveled: {0:0.1f} meters.".format(cball.getX()))
print("nMaximum height traveled: {0:0.1f} meters.".format(cball.getMaxY()))
if __name__ == "__main__":
main()
Комментарии:
1. где код, который использует это
2. Извините, только что добавил его.
3. Совет по отладке. Добавьте оператор печати в update() и посмотрите, как изменяется значение maxypos .
4. Спасибо, Дэвид. После отладки я обнаружил, что НЕПРАВИЛЬНО понял уравнение 🙂
Ответ №1:
Эта строка не имеет особого смысла:
self.maxypos = self.yvel - (9.8 * self.th)
Сохраняйте простоту; попробуйте что-то вроде:
self.maxypos = max(self.maxypos, self.ypos)
после обновления self.ypos
. Вам также потребуется выполнить инициализацию self.maxypos = self.ypos
__init__
.
Вам не нужны все эти тривиальные методы получения; просто получите доступ к атрибуту (Python — это не Java).