C# 二维球碰撞与分辨率

C# 二维球碰撞与分辨率,c#,collision,C#,Collision,我创建了一个简单的方法,通过计算距离来检测两个球之间的碰撞。我想知道,一旦检测到碰撞,我如何更新球的位置以不允许球相互进入(相交) private void BallCollisionBlueRed() { 双重fDist; CentreAX=红球。左+球。宽度/2; 中心=红球。顶部+球。高度/2; CentreBX=蓝球。左+球。宽度/2; CentreBY=蓝球。顶部+球。高度/2; vDx=中心EBX-中心EAX; vDy=CentreBY—CentreAY; fDist=Math.Sq

我创建了一个简单的方法,通过计算距离来检测两个球之间的碰撞。我想知道,一旦检测到碰撞,我如何更新球的位置以不允许球相互进入(相交)

private void BallCollisionBlueRed()
{
双重fDist;
CentreAX=红球。左+球。宽度/2;
中心=红球。顶部+球。高度/2;
CentreBX=蓝球。左+球。宽度/2;
CentreBY=蓝球。顶部+球。高度/2;
vDx=中心EBX-中心EAX;
vDy=CentreBY—CentreAY;
fDist=Math.Sqrt((vDx*vDx)+(vDy*vDy));
中频(fDist

vDx和vDy仅用于保存计算值。我用箭头键(玩家)控制两个球,我不想让它们相互反弹,只是不允许它们相交。

你需要在脑海中描绘互动。当距离正好为零时,对象将反弹并开始彼此远离

从大学开始计算新的轨道已经太久了,但最重要的是,如果radA+radB-fDist是,比如说-4,你需要将新的距离设置为radA+radB+4


这将适应你所有的低fps(直到它们滞后到如此严重,以至于它们在你能检测到碰撞之前相互穿过):-p

关于这类物理的一些好建议,我会读这篇博文:

你在哪里设置球的运动矢量?一旦你检测到碰撞,就应该改变它。如果没有关于程序其余部分的任何信息,很难说,你可以“重置”球的位置,使其不相交,或者你可以尝试一些物理方法(我会这么做)计算每个球的冲量,并将其反转(线性动量守恒)。
    private void BallCollisionBlueRed()
    {
        double fDist;
        CentreAX = redBall.Left + ball.Width / 2;
        CentreAY = redBall.Top + ball.Height / 2;
        CentreBX = blueBall.Left + ball.Width / 2;
        CentreBY = blueBall.Top + ball.Height / 2;

        vDx = CentreBX - CentreAX;
        vDy = CentreBY - CentreAY;
        fDist = Math.Sqrt((vDx * vDx) + (vDy * vDy));

        if (fDist < radA + radB)
        {
           // Help!
        }
    }