检测数组c中绘制的圆之间的碰撞

时间:2015-03-01 07:10:41

标签: c#

我在一个数组中绘制了10个圆圈,这些圆圈在四处移动并在屏幕上弹跳。我如何拍摄这些绘制的圆圈并检测它们何时相互碰撞。当他们碰撞时,我需要他们互相反弹。这些圆圈具有随机宽度和高度。随机速度和所有在中心屏幕上产生。

如何绘制圆圈:

private void pbGamescreen_Paint(object sender, PaintEventArgs e) 
{
    for (int mt = 0; mt < spawn; mt++)
    {
        e.Graphics.FillEllipse(ballBrush[mt], (int)xPos[mt], (int)yPos[mt], ballSizex[mt], ballSizey[mt]);
        e.Graphics.DrawEllipse(Pens.Gray, (int)xPos[mt], (int)yPos[mt], ballSizex[mt], ballSizey[mt]);
    }
}

2 个答案:

答案 0 :(得分:6)

如果两个圆的中心点之间的距离小于其半径的相加,则它们相交。你需要迭代你的每一个圆圈,然后互相检查这个圆圈。

例如,假设您在横轴上有这两个圆圈:

(-----o-----)  (---o---)

它们不相交,因为它们的中心点之间的距离是12,它们的半径之和是8.但是,这两个做了:

(-----o----(-)--o---)

两个2D点之间的距离公式为:

var xdiff = x2 - x1;
var ydiff = y2 - y1;
return Math.Sqrt(xdiff * xdiff + ydiff * ydiff);

答案 1 :(得分:4)

如果r1和r2是两个圆的半径,d是两个圆的中心之间的距离则为

d<=r1 + r2;时反弹 理想情况下,您应该在d == r1 + r2;

时执行此操作

只是一个建议: 同时保持圆的质量与它们的r(半径)成正比,然后使用守恒动量定律m1v1 = m2v2;以一种看似真实的方式反弹它们