矩形

时间:2016-06-28 18:01:23

标签: c++ distance geometry point

我有一个圆圈,必须检查是否有一个矩形。 我想找到矩形的最远角,然后检查它是否在圆圈内。我的第一部分有问题。 我看到人们这样做:

dx = max(centerX - rectLeft, rectRight - centerX);
dy = max(centerY - rectTop, rectBottom - centerY);

但不是吗?例如,我有center (5,6) topLeft (-2,-3width=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?

3 个答案:

答案 0 :(得分:2)

我认为正确的公式应该是:

dx = max(fabs(rectLeft - centerX), fabs(centerX - rectRight));
dy = max(fabs(rectTop - centerY), fabs(centerY - rectBottom));

然后你可以检查:

dx*dx + dy*dy < r*r

如果矩形的边与轴平行,这足以确定矩形是否在内部,只需考虑使用第一个公式我们已将dxdy设置为对应于距圆心的最外顶点的值,以它为准。

答案 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

如果上述任何一个不成立,则矩形不完全在圆圈内。