代码模拟踢球后球位置始终为(0,0):是列表未更新还是公式错误?
问题描述
我正在编写代码模拟给定角度和初速度的球被踢出后,经过一定时间更新其位置。运行结果显示球始终处于(0,0)位置,请问这是position列表未更新,还是运动公式存在错误?
代码片段
import numpy as np class Ball(): def __init__(self, theta, v): self.position = [0, 0] # Position at ground is (0,0) self.theta = 0 self.v = 0 def step(self, delta_t = .1): ball.position[0] = ball.v*np.cos(ball.theta)*t ball.position[1] = (ball.v**2*np.sin(ball.theta))/9.81 return ball.position ball = Ball(theta = 30, v = 100) for t in range(200): ball.step(delta_t = 0.05) print(f'Ball is at x={ball.position[0]:.2f}m, y={ball.position[1]:.2f}m') # Check position
运行输出
Ball is at x=0.00m, y=0.00m
错误分析
你的代码存在多个核心问题,直接导致球的位置始终为(0,0):
- 初始化参数未正确赋值:
__init__方法里把self.theta和self.v硬设为0,完全忽略了传入的参数值。这意味着球的初速度和角度都是0,无论输入多少,计算出的位置必然是(0,0)。 - 错误使用全局变量而非实例属性:
step方法里直接调用全局的ball对象属性,而非用self访问实例自身的属性,逻辑混乱且易出错。 - 运动公式完全错误:
- x方向:循环中的
t是0到199的整数,和实际运动时间无关,且没有累计时间;正确逻辑应该维护一个累计时间变量,用v0*cosθ * 累计时间计算x坐标。 - y方向:你写的是抛体运动的最大高度公式,而非任意时刻的y坐标,正确公式应为
v0*sinθ * 累计时间 - 0.5*g*(累计时间)²(g取9.81)。
- x方向:循环中的
- 未利用delta_t参数:
step方法里的delta_t没有被用来累计时间,无法模拟时间流逝。
修正后的代码示例
import numpy as np class Ball(): def __init__(self, theta, v): self.position = [0.0, 0.0] # 将角度转换为弧度(numpy三角函数默认用弧度计算) self.theta = np.deg2rad(theta) self.v0 = v # 保存初速度 self.total_time = 0.0 # 累计运动时间 self.g = 9.81 def step(self, delta_t=0.1): self.total_time += delta_t # 计算x方向位置(匀速直线运动) self.position[0] = self.v0 * np.cos(self.theta) * self.total_time # 计算y方向位置(匀变速直线运动) self.position[1] = self.v0 * np.sin(self.theta) * self.total_time - 0.5 * self.g * self.total_time**2 # 球落地后不再更新y坐标(可选逻辑) if self.position[1] < 0: self.position[1] = 0.0 return self.position ball = Ball(theta=30, v=100) for _ in range(200): ball.step(delta_t=0.05) print(f'Ball is at x={ball.position[0]:.2f}m, y={ball.position[1]:.2f}m')
内容的提问来源于stack exchange,提问作者ariya
相关产品推荐
相关产品推荐

