我有圆矩形交叉的问题。虽然有一个数字 讨论我发现它,我无法得到我的答案。我的问题是 -
我的视图/窗口的下部(100-200,0-50)(320 X 480)一个球在这里和那里移动。并且 有时它会与矩形相撞并反弹回来。我的问题是我怎么知道哪个轴圈与之相撞 矩形,在x轴或y轴上,表示在哪条线(x = 100或x = 200或y == 50)圆与矩形相交。
*球来自矩形之外。
答案 0 :(得分:2)
要查看它是否完全打开其中一条线很简单:只需检查圆圈的边界框和每条线之间的碰撞。
问题是如果它碰到一个角落......那么你必须将圆与每一条线相交。这can be done,但需要更多的数学。它也会以不寻常的角度反弹。
答案 1 :(得分:0)
假设球的中心沿时间轨迹移动,可以描述为x = a t + b
和y = 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 < 0
或c (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)
通过每侧半径的大小减少矩形,并将圆圈作为点移动。