当前位置: 首页 > 面试题库 >

Java方法仅使用左底点,宽度和高度来查找是两个矩形相交的矩形?

阎星河
2023-03-14
问题内容

我找到了解决方案,但想确保我的逻辑是最有效的。我觉得有更好的方法。我有左下角的(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,宽度,高度,其中x,y是矩形的左上角。您可以轻松地将左下角的点转换为左上角。

我推荐上述方法,但是如果您真的想自己做,可以按照以下步骤操作:

比方说(x1, y1), (x2, y2)分别(x3, y3), (x4, y4)是Rect1的左下角和右下角 。

  • 发现的较大的一个x1x3和中较小的一个x2x4比方说xLxR分别
    • 如果xL >= xR,则不返回任何交集
  • 发现的较大的一个y1y3和中较小的一个y2y4比方说yTyB分别
    • 如果yT >= yB,则不返回任何交集
    • 归还(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部分即可。



 类似资料:
  • 我有两个矩形,每个矩形有4个值: 左侧位置< code>X、顶部位置< code>Y、宽度< code>W和高度< code>H: 矩形不旋转,如下所示: 判断两个矩形的交集是否为空的最佳解是什么?

  • 问题内容: 除了我的Rect类: 我有一种方法来检查两个Rect是否相交(无双关): 测试用例: 这堂课很好。 我想知道的是,是否还有另一种(也许更快)的方式来检查矩形是否相交。我可以以某种方式对其进行优化吗? 问题答案: 我倾向于将矩形存储为min x,min y,max x和max y。然后当发生重叠时 如果它们重叠,则交点定义为 如果它们具有相同的边界,则应根据您是否认为它们重叠来进行一些注

  • 问题内容: 测试2个矩形是否相交的快速方法是什么? 在Internet上进行了搜索,找到了这种单行代码(WOOT!),但我不知道如何用Javascript编写它,它似乎是用C ++的古老形式编写的。 问题答案: 这就是将代码转换为JavaScript的方式。请注意,正如注释所建议的那样,您的代码和本文的代码中都有一个错字。该功能应该并且应该具体起作用。 测试用例:

  • 有人知道一种算法可以用来确定两个矩形重叠的程度和方向吗?我花了好几个小时试图弄清楚这一点,这样我就可以将它实现为一个用slick2d java编写的基本平铺游戏。

  • 我试图找出两个矩形是否相互重叠。我将下面的矩形表示为< code>[x1,x2] x [y1,y2] 我只需要一个伪代码,我可以实现它来查找矩形是否彼此重叠。

  • 文件:main。派克 文件:run_me.py 我试图从左下角到右上角画一条线。 我认为这可能是一个尺度问题(变量self.available\u width,self.available\u height)。 我做错了什么?