圆形 - 矩形碰撞检测(交叉点) [英] Circle-Rectangle collision detection (intersection)

查看:171
本文介绍了圆形 - 矩形碰撞检测(交叉点)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何判断一个圆和一个矩形在二维欧氏空间中是否相交? (即经典的二维几何)

How can I tell whether a circle and a rectangle intersect in 2D Euclidean space? (i.e. classic 2D geometry)

推荐答案

只有两种情况:当圆与矩形相交时:

There are only two cases when the circle intersects with the rectangle:


  • 圆的中心位于矩形内,或者
  • 矩形的一个边在圆中有一个点。
  • Either the circle's centre lies inside the rectangle, or
  • One of the edges of the rectangle has a point in the circle.

请注意,这不需要矩形为轴平行。

Note that this does not require the rectangle to be axis-parallel.

看到这个:如果没有边在圆中有一个点(如果所有的边都完全在圆的外部),那么该圆仍然可以与多边形相交的唯一方式是它完全位于多边形内。)

(One way to see this: if none of the edges has a point in the circle (if all the edges are completely "outside" the circle), then the only way the circle can still intersect the polygon is if it lies completely inside the polygon.)

有了这样的见解,类似下面的内容就可以工作了,圆圈的中心 P 和半径 R ,矩形的顶点为 A B D 按顺序排列(不是完整的代码):

With that insight, something like the following will work, where the circle has centre P and radius R, and the rectangle has vertices A, B, C, D in that order (not complete code):

def intersect(Circle(P, R), Rectangle(A, B, C, D)):
    S = Circle(P, R)
    return (pointInRectangle(P, Rectangle(A, B, C, D)) or
            intersectCircle(S, (A, B)) or
            intersectCircle(S, (B, C)) or
            intersectCircle(S, (C, D)) or
            intersectCircle(S, (D, A)))

如果您正在编写任何几何体,您的库中可能已经具有上述功能。否则,可以用几种方式实现 pointInRectangle();任何一般的点多边形方法都可以工作,但对于矩形,您可以检查是否这样工作:

If you're writing any geometry you probably have the above functions in your library already. Otherwise, pointInRectangle() can be implemented in several ways; any of the general point in polygon methods will work, but for a rectangle you can just check whether this works:

0 ≤ AP·AB ≤ AB·AB and 0 ≤ AP·AD ≤ AD·AD

并且 intersectCircle()也很容易实现:单向会检查从 P 到该线的垂线足够接近并且在端点之间,否则检查端点。

And intersectCircle() is easy to implement too: one way would be to check if the foot of the perpendicular from P to the line is close enough and between the endpoints, and check the endpoints otherwise.

很酷的是, same 理念不仅适用于矩形,而且适用于任何简单的多边形 - 甚至不必凸出!

The cool thing is that the same idea works not just for rectangles but for the intersection of a circle with any simple polygon — doesn't even have to be convex!

这篇关于圆形 - 矩形碰撞检测(交叉点)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆