Java 方法仅使用左下点、宽度和高度来查找作为两个矩形交集的矩形?

标签 java logic intersection

我找到了解决方案,但想确保我的逻辑是最有效的。我觉得有更好的方法。我有左下角的 (x,y) 坐标,2 个矩形的高度和宽度,我需要返回第三个矩形,即它们的交集。我不想发布代码,因为我觉得它在作弊。

  1. 我找出哪个在图表上最左边和最高。
  2. 我检查一个是否与另一个完全重叠,然后反向查看另一个是否与 X 轴上的第一个完全重叠。
  3. 我检查 X 轴上的部分交点。
  4. 我基本上对 Y 轴重复步骤 2 和 3。
  5. 我做了一些数学运算,并根据这些条件得到了矩形的点。

我可能过度思考这个问题并编写了低效的代码。我已经提交了一个工作程序,但想根据我自己的知识找到最好的方法。如果有人同意或指出正确的方向,那就太好了!

最佳答案

为什么不使用 JDK API 为您做这件事呢?

Rectangle rect1 = new Rectangle(100, 100, 200, 240);
Rectangle rect2 = new Rectangle(120, 80, 80, 120);
Rectangle intersection = rect1.intersection(rect2);

使用java.awt.Rectangle类,构造函数的参数为​​:x,y,width,height,其中x,y为矩形的左上角。您可以轻松地将左下角点转换为左上角点。


我推荐上面的,但是如果你真的想自己做,你可以按照下面的步骤:

(x1, y1), (x2, y2) 分别是 Rect1 的左下角和右下角, (x3, y3), (x4, y4) 是 Rect2 的那些。

  • 找出x1x3中较大的一个和x2x4中较小的一个,说xL, xR分别
    • 如果 xL >= xR,则返回无交集 else
  • 找出y1y3中较大的一个和y2y4中较小的一个,说yT, yB分别
    • 如果 yT >= yB,则返回无交集 else
    • 返回 (xL, yB, xR-xL, yB-yT)

更像 Java 的伪代码:

// Two rectangles, assume the class name is `Rect`
Rect r1 = new Rect(x1, y2, w1, h1);
Rect r2 = new Rect(x3, y4, w2, h2);

// get the coordinates of other points needed later:
int x2 = x1 + w1;
int x4 = x3 + w2;
int y1 = y2 - h1;
int y3 = y4 - h2;

// find intersection:
int xL = Math.max(x1, x3);
int xR = Math.min(x2, x4);
if (xR <= xL)
    return null;
else {
    int yT = Math.max(y1, y3);
    int yB = Math.min(y2, y4);
    if (yB <= yT)
        return null;
    else
        return new Rect(xL, yB, xR-xL, yB-yT);
}

如您所见,如果您的矩形最初是由两个对角角定义的,那么会更容易,您只需要执行 //find intersection 部分即可。

关于Java 方法仅使用左下点、宽度和高度来查找作为两个矩形交集的矩形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14616829/

相关文章:

java - 使用 Apache Ant 恢复停止的构建过程

Java 文件格式化正确顺序

java - 寻求有关项目的建议。解析逻辑表达式

php - PHP 查询的逻辑顺序

python - 我在 python 中对多边形点(乔丹曲线定理)的改编是否正确?

javascript - 如何使用 Knockout js 和 html 显示 Google map

Java实践OCAJP混淆答案

java - 如何在Java中模仿音译?

python日期间隔交集

python - python 中 3D 多边形的交点