假设我们有两个矩形,分别定义了它们的左下角和右上角。例如: rect1 (x1, y1)(x2, y2) 和 rect2 (x3, y3)(x4, y4) 。我试图找到相交矩形的坐标(左下角和右上角)。
任何想法,算法,伪代码,将不胜感激。
ps我发现了类似的问题,但他们只检查2个矩形是否相交。
原文由 NoSense 发布,翻译遵循 CC BY-SA 4.0 许可协议
假设我们有两个矩形,分别定义了它们的左下角和右上角。例如: rect1 (x1, y1)(x2, y2) 和 rect2 (x3, y3)(x4, y4) 。我试图找到相交矩形的坐标(左下角和右上角)。
任何想法,算法,伪代码,将不胜感激。
ps我发现了类似的问题,但他们只检查2个矩形是否相交。
原文由 NoSense 发布,翻译遵循 CC BY-SA 4.0 许可协议
可以分别处理 x
和 y
方向。
假设 x1 <= x3
(第一个框至少和第二个一样在左边)。然后,当且仅当 x1 <= x3 <= x2
时才会有重叠。
同样,假设 y1 <= y3
(第一个框至少与第二个框一样远)。然后,当且仅当 y1 <= y3 <= y2
时才会有重叠。
如果两个方向都有重叠,则有一个矩形重叠。您可以通过排序 x
和 y
坐标并选择中间两个来找到坐标。
在伪代码中:
if (((x1 <= x3 && x3 <= x2) || (x3 <= x1 && x1 <= x4)) // x-overlap
&&
((y1 <= y3 && y3 <= y2) || (y3 <= y1 && y1 <= y4)) // y-overlap
) {
int[] xs = {x1, x2, x3, x4};
int[] ys = {y1, y2, y3, y4};
sort(xs);
sort(ys);
// bottom-left: xs[1], ys[1]
// top-right: xs[2], ys[2]
}
原文由 Vincent van der Weele 发布,翻译遵循 CC BY-SA 3.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.5k 阅读
3 回答485 阅读✓ 已解决
如果输入矩形被规范化,即您已经知道
x1 < x2
,y1 < y2
(第二个矩形也是如此),那么您需要做的就是计算它会给你你的交叉点作为矩形
(x5, y5)-(x6, y6)
。如果原始矩形不相交,则结果将是“退化”矩形(带有x5 >= x6
和/或y5 >= y6
),您可以轻松检查。PS 像往常一样,小细节将取决于您是否必须将 触摸 矩形视为相交。