圆 - 矩形交叉

时间:2009-11-21 03:21:17

标签: algorithm

我有圆矩形交叉的问题。虽然有一个数字 讨论我发现它,我无法得到我的答案。我的问题是 -

我的视图/窗口的下部(100-200,0-50)(320 X 480)一个球在这里和那里移动。并且 有时它会与矩形相撞并反弹回来。我的问题是我怎么知道哪个轴圈与之相撞 矩形,在x轴或y轴上,表示在哪条线(x = 100或x = 200或y == 50)圆与矩形相交。

*球来自矩形之外。

4 个答案:

答案 0 :(得分:2)

要查看它是否完全打开其中一条线很简单:只需检查圆圈的边界框和每条线之间的碰撞。

问题是如果它碰到一个角落......那么你必须将圆与每一条线相交。这can be done,但需要更多的数学。它也会以不寻常的角度反弹。

答案 1 :(得分:0)

假设球的中心沿时间轨迹移动,可以描述为x = a t + by = c t + d - 任何线性,均匀速度的运动都可以用这种方式描述。既然你说它最初(比如在t = 0)在矩形之外,我们就知道那时x&lt; 100或x> 200,或y < 0或y> 50(x的条件之一,y的条件之一,都可以为真,但至少有一个必须 - 如果它们都是假的,我们将在矩形内)

因此,检查“在什么时间以及该点与组成矩形的四条线中的每条线的确切位置”;即,当x = 100时得到t(得到t = (100 - b) / a,因此y = c (100 - b) / a + d),x = 200,y = 0,y = 50.丢弃t < 0的解决方案(那些是过去发生的事情),以及其他变量落在矩形边界之外的事物(例如,对于我刚刚提到的t = 100的情况,如果(100 - b) / a < 0,你可以忽略明显的解决方案,或c (100 - b) / a + v < 0c (100 - b) / a + v > 50)。如果四个中没有一个被留下,这意味着球(半径为0 ......)将不会沿着当前轨迹撞击矩形(如果它反弹并因此改变轨迹,它可能会改变轨迹,但这些将是单独的计算)。如果剩下一个或多个,则最小值为t的那个是您想要的那个。一旦你知道中心将在何处以及何时击中矩形,考虑到半径可以单独完成,但不会改变哪个矩形球击中球的问题。

球“扫视”(仅因为半径大于零而击中矩形)的情况更难,但一种方法是,如果正常计算显示球“没有击中”,则在移动后重复球(通过其半径的数量)到它所遵循的轨迹线的两侧 - 这将告诉你球是否实际上要击中,如果是,那么哪一侧(假设在角落上的击球可以是被计算在一角聚集在那个角落的点击; - )。

答案 2 :(得分:0)

怎么样:

让圆心具有坐标cx,cy,radius cr。

if cx > 100 - cr and cx <= 100 and cy <= 50
    collision with left upright
else if cy >= 50 and cy < 50 + cr and cx > 100 and cx < 200
    collision with top
else if cx < 200 + cr and cx >= 200 and cy <= 50
    collision with right upright
else if ( cx - 100 ) ** 2 + ( cy - 50 ) ** 2 < cr ** 2
    collision with top left corner
else if ( cx - 200 ) ** 2 + ( cy - 50 ) ** 2 < cr ** 2
    collision with top right corner
else
    no collision

角落碰撞需要特殊处理,以确定弹跳如何根据准确的接触点和行进方向工作。这也会留下大部分屏幕无法检测到碰撞(在矩形内),我相信你可以添加到上面的算法中。

快速搜索似乎表明之前已经问过这个问题......

答案 3 :(得分:0)

通过每侧半径的大小减少矩形,并将圆圈作为点移动。