当前位置: 首页 > 知识库问答 >
问题:

如何在给定的矩形列表中找到与特定矩形相邻的所有矩形?

商昂然
2023-03-14

给定一个矩形R1和一组矩形R2、R3、…。如何找到与主矩形R1相连的所有矩形。

我不仅需要直接连接到R1的矩形,还需要所有间接连接到R1的矩形。例如,如果 R2 连接到 R1,R3 连接到 R2。R3 被视为连接到 R1。

矩形的形式为(xmin,ymin,xmax,ymax)。所有矩形都与轴平行。当矩形重叠或接触时,它们被认为是连接的。当它们仅接触角落时,它们不被视为连接。

示例:

____________
_111________
_11122______
____22______
____22______
____333333__ 
____22______
__55___4444_
__55___4444_ 

在该示例中,R1、R2、R3彼此连接。所以我需要返回R1,R2,R3。

R4和R5没有连接。

一个明显的解决方案是将每个矩形与彼此的O(n^2)进行比较。但我认为应该有更快的解决方案。我尝试用区间树实现扫描线算法。但它是缓慢的。我需要一个O(n,log,n)中的解

共有1个答案

庞意智
2023-03-14

创建2个列表,一个包含X坐标对象,一个包含Y坐标对象。

该对象将包括(坐标、矩形编号以及坐标是对应于最小值还是最大值)。

对两个列表O(nlogn)进行排序,并遍历任意一个。遇到最小坐标时,在堆栈中添加矩形,遇到最大坐标时,删除矩形。如果将多个矩形一起添加到堆栈中,将它们添加到一个组中,当移除一个矩形时,该组将对应于所有重叠的矩形。存储这些组的信息。使用另一个列表执行相同的步骤。从X和Y列表获得的组中的公共矩形将是重叠矩形。

解决方案是 O(nlogn)。

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

  • 我有一个点[xmin,ymin,xmax,ymax]的列表,每个点都按黑点显示 请注意,有许多这样的矩形,如图像所示。红色的应检测删除,绿色的应保留。 输入是 n 矩形 输出是覆盖区域和它覆盖的矩形 id 。最好给出一些算法和解释。

  • 我试图在现有画布中的特定框顶部添加一些红色矩形,与预期结果图像完全相同,但它们根本没有出现,因为我的代码显示了部署应用程序时当前不希望出现的结果。我的代码是在顶行和底行分别创建4个矩形,但我只想将其添加到框2-6的顶部,但我知道需要为框1顶部的红色矩形添加额外的代码 activity_main.xml MainActivity.java

  • 问题内容: 我正在尝试编写一种算法,用于在给定的子矩阵中查找子矩阵。为了解决这个问题,我编写了以下代码: 这段代码可以正常工作,但是我不确定这是问题的确切解决方案还是可以解决。请提供您的专家意见。提前致谢。 问题答案: 该算法对4×4矩阵和2×2子矩阵进行了硬编码。否则,它看起来像蛮力算法。 我会这样表示: 如果您想要更有效的方法,建议您将它们压扁,如下所示: 并在此序列中搜索以下模式: 使用标准

  • 我需要通过给定的背景色键为位图计算一个闭合裁剪矩形。在下面的图片中,你可以看到什么是关闭作物。左边是源,右边是关闭作物的输出: 正如你所看到的,我需要找到与背景颜色不同的最上面、最左边、最下面和最右边的像素来构建关闭裁剪矩形。那么,如何找到那些不同的外部像素来得到接近的裁剪矩形呢?或者,换句话说,如何计算位图的闭合裁剪矩形?

  • 我必须找到多个矩形(最小有界矩形)的确切质心。让我有,3个矩形及其坐标,用于最大和最小点 第一个矩形的最小点(x1,y1),最大点(x2,y2) 第二个矩形的最小点(x3,y3),最大点(x4,y4) 第三个矩形的最小点(x5, y5),最大点(x6, y6) 我想到的快速解决方案是,通过考虑这6个点的组合,我将找到可能的质心列表,然后取这些质心的最小有界矩形。它会给我一个矩形R,这个矩形的质心是