【问题标题】:Grouping Overlapping Shapes (x,y)分组重叠形状 (x,y)
【发布时间】:2016-09-24 22:23:57
【问题描述】:

我使用 x-y 坐标(左下角、右上角)查找重叠矩形(区域)的算法工作正常。但是我将重叠的组合在一起的算法似乎不起作用。有人可以告诉我我做错了什么吗?

我的程序从这样的 .txt 文件中读取 x-y 坐标...

0 5 3 6 (0,5 is bottom left corner and 3,6 is top right corner)

2 7 8 9 (2,7 is bottom left corner and 8,9 is top right corner)

然后找出重叠矩形上的所有组并打印出组。

即矩形 0 与 2 重叠,2 与 1 重叠,1 与 5 重叠。这意味着矩形 0、2、1 和 5 都在 1 个组中,因此我可以打印出该组 #1。

即矩形 4 和 3 重叠,这意味着矩形 4 和 3 在组 #2 中。

即矩形 10 与 11 重叠,矩形 11 与矩形 12 重叠。这意味着矩形 10、11 和 12 都在第 3 组中,这样我就可以整齐地打印出来了。

【问题讨论】:

  • 您的问题不清楚。究竟是什么问题?
  • 问题是如果rect1和rect2重叠,rect2和rect5重叠,rect3和rect4重叠,你会存储[1,2,5]为一个组,而[3,4 ] 作为一个团队;如果在那之后您发现 4 和 5 重叠,您需要一种方法将这两个组连接在一起。否则,您需要先找到所有重叠部分,然后再创建组。
  • 不要破坏你的问题。
  • deviantfan,请删除/删除此帖子。谢谢。
  • @Optimiz 我不能,你也不能。在这里获得帮助包括您留下所有东西,以便它也可以帮助其他人。

标签: c++ algorithm equivalence


【解决方案1】:

据我了解,您需要做的是实现一个联合查找数据结构来存储连接的组件。它完全符合您的意图。有关更多解释,您应该阅读这个问题:Union-find data structure

使用提到的代码你需要做的是:

UF uf( n ); // create and initialize a UF. n is the number of rectangles you have
if ( two rectangles overlap ){ 
     if ( ! connected( rectangleId1, rectangleId2 ) ){ // if they aren't already in the same component
           merge( find(rectangleId1), find(rectangleId2) ); // put them in the same component
     }
}

之后,find( rectangleId ) 具有相同值的每个矩形都属于同一个组件。

【讨论】:

猜你喜欢
  • 2019-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多