我有一个圆圈,必须检查是否有一个矩形。 我想找到矩形的最远角,然后检查它是否在圆圈内。我的第一部分有问题。 我看到人们这样做:
dx = max(centerX - rectLeft, rectRight - centerX);
dy = max(centerY - rectTop, rectBottom - centerY);
但不是吗?例如,我有center (5,6)
topLeft (-2,-3
)width=9
height=8
dx = max( 5 - -2, -2 + 9 - 5) = max(7, 2) which is 7 = OK
但
dy = max( 6 - -3, -3 - 8 - 6) = max( 9, -17 ) = 9
这不好,因为17比中心更远。我错了还是应该用fabs
来表示第17点而不是-17?
答案 0 :(得分:2)
我认为正确的公式应该是:
dx = max(fabs(rectLeft - centerX), fabs(centerX - rectRight));
dy = max(fabs(rectTop - centerY), fabs(centerY - rectBottom));
然后你可以检查:
dx*dx + dy*dy < r*r
如果矩形的边与轴平行,这足以确定矩形是否在内部,只需考虑使用第一个公式我们已将dx
和dy
设置为对应于距圆心的最外顶点的值,以它为准。
答案 1 :(得分:1)
是;总是使用fabs()
来解决距离问题,因为距离应始终为正。
答案 2 :(得分:1)
上述dx和dy的方法不一定有效。 dx*dx + dy*dy < r*r
是得出矩形在圆内的必要但不充分的条件。
而是以这种方式思考问题。矩形上距离圆心最远的点将是矩形的顶点之一。为简单起见,想象一下原点(0,0)处的圆(半径= r)。想象一个高度为h,宽度为w的矩形和(x,y)处的顶部顶点。然后剩余的顶点将是(x,y-h),(x + w,y)和(x + w,y-h)。现在要确保矩形完全在圆内,只需检查矩形的每个顶点是否在圆内。条件如下:
x*x + y*y < r*r
(x+w)*(x+w) + y*y < r*r
x*x + (y-h)*(y-h) < r*r
(x+w)*(x+w) + (y-h)*(y-h) < r*r
如果上述任何一个不成立,则矩形不完全在圆圈内。