Python 台球碰撞响应与我的公式角度问题

0 投票
1 回答
733 浏览
提问于 2025-04-17 13:23

这是我为模拟台球碰撞而写的代码,主要是处理两个移动的球相撞的情况。我用了牛顿的运动定律,然后把速度向量的各个部分进行了参数化。

Alpha代表球1的运动轨迹
Beta代表球2的运动轨迹
Theta是两个球心连线与坐标轴之间的角度

我的想法是先在两个球的局部坐标系中找出一个通用的碰撞反应公式,然后再把它转换回我的固定坐标系。但是我发现有一些角度的问题,我完全搞不清楚,比如说alpha应该满足什么条件。

最后一部分是为了确保碰撞后两个球不会重叠在一起,避免它们陷入无限碰撞的循环中。

    def collision(b1,b2):

        dx=b1.x-b2.x
        dy=b1.y-b2.y
        Theta = atan2(dy,dx)
        Vx1=b1.speedx
        Vy1=b1.speedy


        Vx2=b2.speedx
        Vy2=b2.speedy

        V1 = sqrt((Vx1)**2+(Vx1)**2)
        V2 = sqrt((Vx2)**2+(Vx1)**2)
        Alpha = asin(Vx1/V1)
        Beta = asin(Vx2/V2)


       b1.speedx = (((1-e)/2)*V1*sin(Alpha-Theta) - ((1+e)/2)*V2*sin(Beta-Theta))*sin(Theta) - V1*cos(Alpha-Theta)*cos(Theta)
       b1.speedy = (((1-e)/2)*V1*sin(Alpha-Theta) - ((1+e)/2)*V2*sin(Beta-Theta))*cos(Theta) + V1*cos(Alpha-Theta)*sin(Theta)
       b2.speedx = (((1+e)/2)*V1*sin(Alpha-Theta) - ((1-e)/2)*V2*sin(Beta-Theta))*sin(Theta) + V2*cos(Beta-Theta)*cos(Theta)
       b2.speedy = (((1+e)/2)*V1*sin(Alpha-Theta) - ((1-e)/2)*V2*sin(Beta-Theta))*cos(Theta) - V2*cos(Beta-Theta)*sin(Theta)

1 个回答

0

不要用asin来计算角度。如果你一定要用角度(而不是向量),那就应该用atan2。

撰写回答