【问题标题】:Physics simulator in water python水蟒中的物理模拟器
【发布时间】:2012-09-05 22:47:32
【问题描述】:

我在理解如何模拟这样的情况时遇到问题:http://phet.colorado.edu/sims/density-and-buoyancy/buoyancy_en.html

该程序的重​​点是制作一个模拟器 - 就像链接中的那个一样。我想保持现实并使用 Python。我想在Pygame中绘制模拟。

在我的程序中,我要求几个变量;质量和半径。半径将用于计算球体的体积,质量将用于计算浮力、重力和加速度。

但问题是,为了将所有内容保持在 SI 单位中,我要求以米为单位的半径。这样做的同时将我的半径保持在 10 厘米以下,这是一个非常小的数字。当我使用 Pygame 模块绘制一个 0.1m 大小的球体时,它失败了。因此,我需要使用更大的规模,而不是这样做。

所以我的主要问题来了。我应该如何精确地缩放球体?假设我想将 100 个像素定义为 1 米。然后我必须将我的半径乘以 100,因为那将是比例,但是现在球体更大了,如果速度也乘以 100?

我对此感到非常困惑!感谢您的宝贵时间。

不知道你是否需要看这个,无论如何。
计算.py

import math

class Formulas():
    def __init__(self):
        self.pi = 3.1415926535
        self.gravity = 9.82 #m/s^2
        self.density_water = 1000.0 #kg/m^3
        self.density_air   = 1.29 #kg/m^3
        self.drag_sphere   = 0.47

    def object_buoyancy(self, volume, medium_density):
        buoyancy = volume * medium_density * self.gravity #N
        return buoyancy

    def object_gravity(self, mass):
        gravity_force = mass * self.gravity #N
        return gravity_force

    def object_volume_sphere(self, radius):
        volume  = 1.3333333 * self.pi * math.pow(radius, 3) #m^3
        return volume

    def object_mass(self, density, volume):
        mass = volume * density #kg
        return mass

    def object_acceleration(self, gravity_force, buoyancy, mass):
        total_force = gravity_force - buoyancy #N
        acceleration = total_force / mass #m/s^2
        return acceleration

    def object_speed(self, acceleration, time, scale):
        speed  = acceleration * (float(time)/1000.0) #m/s
        return speed

    def surface_area(self, radius):
        area = 4 * self.pi * math.pow(radius, 2)
        return area

【问题讨论】:

  • 您应该能够通过在需要显示某些内容的任何地方替换 1 m = 100px 来定义“显示单位”中的所有内容。您已经跟踪了所有内容的单位,所以应该不难。
  • 好的,所以当我显示我的球体时,我需要做的就是将它放大 100 倍?我不需要相应地提高速度吗?
  • @SimonBob 您正在显示的所有内容...也就是说,如果您要将对象显示为 100 像素 x 100 像素,则将其缩放为 200 像素 x 200 像素等,并且它的位置也会被缩放。 ..(你不会改变上面的数学只是它的显示方式)
  • @SimonBob 在 some 的意义上,如果它以 1px/s 的速度行进,现在将是 2px/s。但这是在 display 部分...在m 中完成所有数学运算,然后在绘制内容时将m 转换为 px。
  • @SimonBob,hayden 完全正确,只需更改显示部分的内容,将计算保持在物理单位中。然后,当您使用您选择的某些因素显示将米转换为像素时。您甚至可能不需要转换速度(因为您可能只处理坐标),但是通过相同的单位转换,1 m/s 将变为 100 px/s。

标签: python pygame physics simulator


【解决方案1】:

就像物理学中的许多问题一样,这个问题可以使用dimensional analysis 来解决。

让我们看看你定义的那些常量:

self.pi = 3.1415926535
self.gravity = 9.82 #m/s^2
self.density_water = 1000.0 #kg/m^3
self.density_air   = 1.29 #kg/m^3
self.drag_sphere   = 0.47

为了保持一致并缩放您的所有距离,以便1 m = 100 px,我们需要缩放您的常量:

self.pi = 3.1415926535
self.gravity = 982.0 #px/s^2
self.density_water = 0.001 #kg/px^3
self.density_air   = 0.00000129 #kg/px^3
self.drag_sphere   = 0.47

您唯一需要做的另一件事是将您的 radius 变量增加 100 倍。之后,您的其余计算将符合要求:

  1. 你的体积计算是正确的,所以
  2. 你的质量和表面积计算会改变,所以
  3. 你的重力和浮力会改变,所以
  4. 你的加速度会改变,所以
  5. 最后,你的速度是正确的。

在您的方程式/方法中,我看不到您的medium_density 的设置位置,因此我也必须进行更改。但是,最后,您所要做的就是缩放所有具有“距离”单位的输入,并且您的输出变量将被正确缩放。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 2013-03-26
    • 2018-04-18
    • 2023-03-16
    • 1970-01-01
    • 2019-03-02
    相关资源
    最近更新 更多