【问题标题】:Sticky blocks in 2D elastic collisions with VPython使用 VPython 进行 2D 弹性碰撞中的粘性块
【发布时间】:2020-01-29 07:29:00
【问题描述】:

我正在尝试实现this video 中引入的著名弹性碰撞问题。

我正在使用 VPython 来模拟整个事情,但是我的代码由于某种原因无法正常运行;似乎当第三次碰撞发生时,块无限期地“碰撞”(碰撞计数器不断增加),然后块粘在一起。他们甚至穿过墙而不是在墙上弹跳,我不知道为什么。

这是我的代码:

from vpython import *
import numpy as np
import time


def compute_pi(number_of_digits):
    scene = canvas(width=1280, height=720, range=3.8, center=vec(6, 0, 0))
    scene.title = 'Computing PI with collisions'

    # blocks
    small_block = box(
        pos=vec(2.0, -2.5, 0.0), 
        size=vec(1.0, 1.0, 0.01), 
        color=vec(0.5, 1.0, 0.3)
    )
    large_block = box(
        pos=vec(4.0, -2.0, 0.0), 
        size=vec(2.0, 2.0, 0.01), 
        color=vec(1.0, 0.5, 0.3)
    )

    # wall & ground
    wall = box(
        pos=vec(0.0, 0.0, 0.0), 
        size=vec(0.1, 6, 0.01), 
        color=vec(1.0, 1.0, 1.0)
    )
    ground = box(
        pos=vec(9.95, -3.0, 0.0), 
        size=vec(20, 0.1, 0.01), 
        color=vec(1.0, 1.0, 1.0)
    )

    # initial conditions
    small_block.m = 1.0
    large_block.m = 100 ** (number_of_digits - 1)
    small_block.vel = vec(0.0, 0.0, 0.0)
    large_block.vel = vec(-0.01, 0.0, 0.0)

    t = 0
    dt = 0.05
    collisions_counter = 0

    time.sleep(0.5)

    while True:
        rate(1000)
        large_block.pos += large_block.vel * dt
        small_block.pos += small_block.vel * dt

        # wall collision
        if (small_block.pos.x - small_block.size.x / 2 < wall.pos.x + wall.size.x / 2):
            small_block.vel *= -1
            collisions_counter += 1
            print ("Number of collisions: " + str(collisions_counter))

        # blocks collision
        if (small_block.pos.x + small_block.size.x / 2 > large_block.pos.x - large_block.size.x / 2):
            small_block.vel = ((small_block.m - large_block.m) / (small_block.m + large_block.m)) * small_block.vel + ((2 * large_block.m) / (small_block.m + large_block.m)) * large_block.vel
            large_block.vel = ((2 * small_block.m) / (small_block.m + large_block.m)) * small_block.vel + ((large_block.m - small_block.m) / (small_block.m + large_block.m)) * large_block.vel
            collisions_counter += 1
            print ("Number of collisions: " + str(collisions_counter))

        t += dt 

【问题讨论】:

    标签: python collision-detection collision bounce vpython


    【解决方案1】:

    我不能在这里研究你所有的物理,但我认为你可能已经成为以下问题的受害者:当发生碰撞使速度的 x 分量反转时,简单地设置 vx = -vx 似乎很自然。不幸的是,如果最近的移动超出边界足够深,如果在下一个时间间隔内您仍然足够超过边界以再次翻转电荷符号,则您可能会出现振荡纤颤。更安全的测试是显式:如果您发现位置在边界的右侧,则显式设置 vx = -abs(vx),如果在边界的左侧,则显式设置 vx = abs(vx)。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    • 2021-09-26
    • 2014-02-27
    • 2014-02-15
    相关资源
    最近更新 更多