Python水中物理模拟器

6
我遇到了如何模拟这种情况的问题:http://phet.colorado.edu/sims/density-and-buoyancy/buoyancy_en.html。该程序的目的是制作一个类似于链接中的模拟器,我想保持真实并使用Python,并在Pygame中绘制模拟。
在我的程序中,我要求输入几个变量:质量和半径。半径将用于计算球体的体积,而质量将用于计算浮力、重力和加速度。
但问题是,为了保持所有单位为国际单位制(SI-unit),我要求以米为单位输入半径。在将半径保持在小于10厘米的情况下,会得到一个非常小的数字。当我使用Pygame模块绘制大小为0.1m的球体时,它就失败了。因此,我需要使用更大的比例尺。
现在出现了主要的问题。我应该如何缩放球体?假设我想定义100像素为1米。然后,我将不得不将我的半径乘以100,因为那就是比例尺。但是现在球体变大了,速度也应该乘以100吗?
我已经感到非常困惑了!感谢您的时间。
不知道是否需要查看这个,无论如何。
Calculations.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
你应该能够通过将1米=100像素替换到需要显示的所有地方来定义“显示单位”中的所有内容。你已经跟踪了所有内容的单位,所以这不应该太难。 - Benjamin Bannier
1
@SimonBob 你所展示的所有内容...也就是说,如果你要将一个对象显示为100像素乘以100像素,那么你需要将其缩放为200像素乘以200像素等,同时它的位置也会被缩放...(你不改变上面的数学计算,只是改变它的显示方式) - Andy Hayden
@hayden 我只显示球和蓝色背景。但困扰我的是,当我使用速度公式时,结果以[m/s]为单位,但我制定了100:1的比例因子。那么速度也应该乘以比例因子吗? - Simon Larsen
1
@SimonBob 在某种意义上,如果它以1像素/秒的速度移动,现在将以2像素/秒的速度移动。但这是在显示部分...在绘制图形时,将所有数学计算都转换为 m,然后再将 m 转换为像素(px)。 - Andy Hayden
3
@SimonBob,Hayden说得很对,只需更改显示部分的内容,保持你的计算结果以物理单位为准。然后,在显示时,使用你选择的某个因子将米转换为像素。你可能甚至不需要转换速度(因为你可能只处理坐标),但是1 m/s 会通过同样的单位转换变成100 px/s。 - Benjamin Bannier
显示剩余4条评论
1个回答

2

像物理学中许多问题一样,这个问题可以使用量纲分析来解决。

让我们看看您定义的那些常数:

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,所以它可能也需要改变。但最终,你只需要缩放所有距离单位的输入,你的输出变量就会被正确地缩放。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接