Pygame昨日正常今日仅黑屏,密立根实验模拟程序故障求助
密立根实验模拟程序Pygame黑屏问题修复
问题根源
- 物理单位与像素单位不匹配:代码使用真实世界物理单位(米、千克),但Pygame坐标是像素量级,导致油滴瞬间移出屏幕,视觉上呈现黑屏。
- 重复位置更新:
aktualisiere_pos和F_R方法均更新self.pos,导致位置计算逻辑冲突,油滴运动混乱。 - Pygame退出逻辑错误:
pg.quit未加括号,无法正确终止Pygame资源。 - 浮力计算缺失关键参数:原浮力公式未计入空气密度,力的平衡完全失衡。
修复步骤
1. 引入单位缩放因子
添加缩放因子将物理单位转换为像素单位,解决量级不匹配问题:
# 缩放因子:1米 = 1000像素,可根据效果调整 scale = 1000 rho_luft = 1.225 # 空气密度,kg/m³
2. 修正油滴类初始化与物理计算
将物理量与像素量分离,确保计算用真实单位,显示用像素单位:
class Oel: def __init__(self, pos, lad, geschw, rad, masse): self.pos = pg.Vector2(pos) self.lad = lad # 使用传入的随机电荷,而非全局固定值 self.geschw = pg.Vector2(np.random.uniform(-1, 1), np.random.uniform(-1, 1)).normalize() * 10 # 半径从物理单位转换为像素单位 self.radius = rad * scale phys_radius = rad # 真实物理半径(米) self.masse = ((4/3) * pi * phys_radius**3) * rho self.rect = pg.Rect(self.pos.x - self.radius, self.pos.y - self.radius, self.radius * 2, self.radius * 2)
3. 合并位置更新逻辑
删除aktualisiere_pos中的位置更新代码,仅保留边界碰撞检测,所有位置更新由F_R统一处理:
def aktualisiere_pos(self): # 边界碰撞反弹 if self.pos.x - self.radius <= 0 or self.pos.x + self.radius >= 800: self.geschw.x *= -1 if self.pos.y - self.radius <= 0 or self.pos.y + self.radius >= 600: self.geschw.y *= -1 # 更新碰撞检测矩形 self.rect = pg.Rect(self.pos.x - self.radius, self.pos.y - self.radius, self.radius * 2, self.radius * 2)
4. 修正力的计算逻辑
统一物理量的单位转换,修正浮力和阻力计算:
def F_R(self): if np.linalg.norm(self.geschw) == 0: self.geschw = pg.Vector2(0.01, 0.01) # 转换为物理单位计算 phys_geschw = self.geschw / scale phys_radius = self.radius / scale # 斯托克斯阻力 F_r_mag = 6 * pi * eta * phys_radius * np.linalg.norm(phys_geschw) F_r = pg.Vector2(-F_r_mag * phys_geschw.normalize()) * scale # 转回像素力 # 重力、电场力、浮力(均转换为像素力) F_g = pg.Vector2(0, self.masse * g) * scale F_c = pg.Vector2(0, -self.lad * (U / d)) * scale F_a = pg.Vector2(0, (4/3) * pi * phys_radius**3 * rho_luft * g) * scale F_ges = F_r + F_g + F_a + F_c a = F_ges / self.masse self.geschw += a * dt self.pos += self.geschw * dt
5. 修复退出代码
确保正确终止Pygame:
if action.type == QUIT: pg.quit() sys.exit()
额外优化点
- 将全局变量
q替换为每个油滴的随机电荷,符合实验设定。 - 调整速度初始值,避免油滴运动过快。
内容的提问来源于stack exchange,提问作者Gobl
相关产品推荐
相关产品推荐

