我有数学问题。
当两个矩形(或其中一个)没有角度并且完全适合网格时,我没有问题检查一个矩形是否在另一个矩形的范围内。但是一旦我改变了它们的角度,它就会全部下坡
答案 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)
答案 3 :(得分:0)