在水蟒的物理模拟器

Sim*_*sen 5 python pygame simulator physics

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

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

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

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

所以这是我的主要问题.我应该如何扩展球体?假设我想将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
Run Code Online (Sandbox Code Playgroud)

the*_*Sin 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
Run Code Online (Sandbox Code Playgroud)

为了保持一致并缩放所有距离,以便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
Run Code Online (Sandbox Code Playgroud)

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

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

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