检查矩形的任何角是否在其他矩形

时间:2016-05-30 00:43:57

标签: math collision bounding

我有数学问题。

当两个矩形(或其中一个)没有角度并且完全适合网格时,我没有问题检查一个矩形是否在另一个矩形的范围内。但是一旦我改变了它们的角度,它就会全部下坡

这就是我的意思 - 右边的那个完美无瑕,但左边的那个并没有那么多: enter image description here

4 个答案:

答案 0 :(得分:1)

可以在不使用旋转(意味着调用trig函数)或规范化向量(需要sqrt)的情况下执行此操作。

假设您的矩形由点a,b,c,d按顺时针顺序定义。如果点位于每个向量ab,bc,cd和da的右侧,则该点位于矩形内部。

您可以通过将矢量ap的点积乘以垂直于ab的向量来测试向量ab的点p,您可以通过交换x和y并翻转其中一个符号来获得。点积的符号告诉您所在矢量的哪一侧。

如果符号都是正数,则该点在矩形内。您不需要进行标准化,因为您只检查符号,而不是检查幅度。

float pointToVector(Vec2 p, Vec2 a, Vec2 b)
{
    Vec2 n = new Vec2(b.y - a.y, a.x - b.x); // no need to normalize

    return n.dot(p - a);
}

bool pointInRect(Vec2 p, Vec2 a, Vec2 b, Vec2 c, Vec2 d)
{
    return (pointToVector(p, a, b) > 0) && // can short-circuit
       (pointToVector(p, b, c) > 0) &&
       (pointToVector(p, c, d) > 0) &&
       (pointToVector(p, d, a) > 0));
}

请注意,这实际上是一个任意四点凸面多边形测试。您可以利用ab和cd平行的事实来优化矩形,bc和da也是如此,因此您可以重用垂直向量但反转检查的符号。这使代码变得复杂一些。此外,上面假设一个坐标系统,y增加了。如果没有,则将比较更改为<或以逆时针顺序定义矩形。

答案 1 :(得分:0)

您可以旋转两个矩形,使其与网格对齐。首先,计算两个矩形的degree of rotation

angle = arc tan(ength of long side / length of short side)
        arc tan(11 / 7)
      = 57.5 degrees

现在您知道绿色三角形从其长边平行于x轴逆时针旋转57.5度。因此,您可以顺时针旋转两个矩形57.5度,以获得您可以处理的配置。有关如何执行此操作,请参阅here

答案 2 :(得分:0)

我建议只使用蒂姆的答案,而不要对轮换如此苛刻。但是,如果您确实太强OCD,您可以尝试以下基于矢量的方法。

由于矩形的边是垂直的,因此可以将它们用作(正交)坐标系。

enter image description here

新坐标轴:

enter image description here

转换坐标:

enter image description here

检查:

enter image description here

答案 3 :(得分:0)

enter image description here

P = a A + b B

解决ab。如果a < 1 && b < 1

,P在矩形内