3 回答
TA贡献2019条经验 获得超9个赞
要么圆心位于矩形内,要么 矩形的一个边在圆中有一个点。
P
R
A
, B
, C
, D
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()
0 ≤ AP·AB ≤ AB·AB and 0 ≤ AP·AD ≤ AD·AD
intersectCircle()
P
TA贡献1801条经验 获得超8个赞
bool intersects(CircleType circle, RectType rect) { circleDistance.x = abs(circle.x - rect.x); circleDistance.y = abs(circle.y - rect.y); if (circleDistance.x > (rect.width/2 + circle.r)) { return false; } if (circleDistance.y > (rect.height/2 + circle.r)) { return false; } if (circleDistance.x <= (rect.width/2)) { return true; } if (circleDistance.y <= (rect.height/2)) { return true; } cornerDistance_sq = (circleDistance.x - rect.width/2)^2 + (circleDistance.y - rect.height/2)^2; return (cornerDistance_sq <= (circle.r^2)); }
第一对直线计算圆心和矩形中心之间x和y差值的绝对值。这会将四个象限折叠成一个,这样计算就不必再做四次了。这张图显示了圆心现在必须放置的区域。注意,只显示了一个象限。矩形是灰色区域,红色边框勾勒出与矩形边缘正好有一个半径的临界区域。圆的中心必须在这个红色的边界内,才能发生交点。 第二对线消除了简单的情况,即圆离矩形足够远(在任一方向),不可能相交。这与图像中的绿色区域相对应。 第三对线处理简单的情况,即圆足够接近矩形(在任一方向),以保证一个交点。这对应于图像中的橙色和灰色部分。注意,这个步骤必须在步骤2之后完成,这样逻辑才有意义。 其余的线计算出圆圈可能与矩形角相交的困难情况。若要求解,请计算从圆心到拐角的距离,然后验证距离不大于圆的半径。此计算对中心位于红色阴影区域内的所有圆返回false,对于中心位于白阴影区域内的所有圆返回true。
添加回答
举报