You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pygame昨日正常今日仅黑屏,密立根实验模拟程序故障求助

密立根实验模拟程序Pygame黑屏问题修复

问题根源

  1. 物理单位与像素单位不匹配:代码使用真实世界物理单位(米、千克),但Pygame坐标是像素量级,导致油滴瞬间移出屏幕,视觉上呈现黑屏。
  2. 重复位置更新:aktualisiere_pos和F_R方法均更新self.pos,导致位置计算逻辑冲突,油滴运动混乱。
  3. Pygame退出逻辑错误:pg.quit未加括号,无法正确终止Pygame资源。
  4. 浮力计算缺失关键参数:原浮力公式未计入空气密度,力的平衡完全失衡。

修复步骤

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 01:42:25