从2个矩形中获取交点

新手上路,请多包涵

假设我们有两个矩形,分别定义了它们的左下角和右上角。例如: rect1 (x1, y1)(x2, y2)rect2 (x3, y3)(x4, y4) 。我试图找到相交矩形的坐标(左下角和右上角)。

任何想法,算法,伪代码,将不胜感激。

ps我发现了类似的问题,但他们只检查2个矩形是否相交。

原文由 NoSense 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 848
2 个回答

如果输入矩形被规范化,即您已经知道 x1 < x2y1 < y2 (第二个矩形也是如此),那么您需要做的就是计算

int x5 = max(x1, x3);
int y5 = max(y1, y3);
int x6 = min(x2, x4);
int y6 = min(y2, y4);

它会给你你的交叉点作为矩形 (x5, y5)-(x6, y6) 。如果原始矩形不相交,则结果将是“退化”矩形(带有 x5 >= x6 和/或 y5 >= y6 ),您可以轻松检查。

PS 像往常一样,小细节将取决于您是否必须将 触摸 矩形视为相交。

原文由 AnT stands with Russia 发布,翻译遵循 CC BY-SA 3.0 许可协议

可以分别处理 xy 方向。

假设 x1 <= x3 (第一个框至少和第二个一样在左边)。然后,当且仅当 x1 <= x3 <= x2 时才会有重叠。

同样,假设 y1 <= y3 (第一个框至少与第二个框一样远)。然后,当且仅当 y1 <= y3 <= y2 时才会有重叠。

如果两个方向都有重叠,则有一个矩形重叠。您可以通过排序 xy 坐标并选择中间两个来找到坐标。

在伪代码中:

 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 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题