【问题标题】:Merging two overlapping rectangles into the resulting polygon将两个重叠的矩形合并到生成的多边形中
【发布时间】:2014-05-13 10:19:35
【问题描述】:

我正在寻找一种算法,给定两个部分或全部重叠的矩形,找到顶点的有序列表,该列表定义了表示两个矩形之和的多边形。

更具体一点:

  • 我有两个有序的点列表作为输入,代表两个矩形
  • 我知道如何找到生成的多边形的顶点,该多边形由每个矩形在另一个矩形之外的顶点加上一个矩形的每个边缘与另一个矩形的每个边缘之间的交点形成
  • 我目前不知道如何将如上所述获得的点排序到数组中,以便数组的元素 j 和 j+1 代表同一条边的两个顶点(这就是我的意思顶点的有序列表)。

提前感谢您的帮助

更新: 我找到了一种对顶点进行排序以获得多边形的方法,如下:

  • 计算顶点质心(坐标平均值)
  • 按从质心到顶点的线段与通过质心的任何参考线(例如 X 轴)之间形成的角度对顶点进行排序。

但是,尽管我始终获得一个包围两个矩形的多边形,没有孔或相交的边缘,但它并不总是我想要的多边形(有时它包括不属于输入矩形之一的额外区域)。

所以我要回到其中一个 cmets 中指出的解决方案,这里也有描述:

polygon union without holes

【问题讨论】:

  • 这个类似于http://stackoverflow.com/questions/8011267/area-of-rectangle-rectangle-intersection/8011422#8011422,处理的基本一样,只是转弯规则不同。
  • 是的,我没有读到那个答案,但我已经尝试过与这种方法非常相似的方法,但在极端情况下一直磕磕绊绊,特别是当矩形的某个顶点位于另一个矩形的边缘时,这两个矩形的构造方式经常发生。因此,我将方法转换为问题中概述的方法,认为它的极端情况会更少。如果这不起作用,也许我会回到第一个解决方案并尝试解决极端情况。
  • 是的,极端案例增加了复杂性,这一点毫无疑问。

标签: algorithm merge geometry rectangles


【解决方案1】:

一旦你有了 4 个顶点,你只需使用距离公式找到更远的点(因为我们似乎无法假设共线或未旋转的起始矩形)

所以如果你有点 a = (xA, yA), b, c, d 并且你知道这 4 个点构成一个矩形

浮动距离(点 a,点 b){ 浮动 dx = a.x - b.x; 浮动 dy = a.y - b.y; 返回 Math.sqrt(dx * dx + dy * dy); } //其他地方,你需要它的地方 //将点A放入索引0 点 curFarthest = b; 浮动距离 = dist(a, b); 如果(距离(a,c)>距离){ curFarther = c; 距离 = dist(a, c); } else if (dist(a, d) > distance){ curFarther = d; curFarthest = dist(a, d); } //将curFarthest存储到索引2 // 存储其余部分(不包括点 a 和 curFarthest) // 以无特定顺序进入索引 1 和 3

【讨论】:

  • 不确定我理解你的意思,但还是谢谢你。两个矩形的合并不是一个矩形,而是一个通常有5+个顶点的非凸多边形,所以我有4个以上的点要处理。另请参阅我的问题的更新。
【解决方案2】:

我正在解决同样的问题,但我使用了不同的方法(工作仍在进行中)。

  1. 找到交点。
  2. 每个点(顶点)与其相邻连接点的距离。
  3. 使用 Dinics 算法找到最大流量。

注意:会有一些特殊情况。但话说回来,我的问题又围绕着具有 1 个公共点(顶点)的多边形。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    • 2012-03-08
    • 2021-06-18
    • 2017-01-15
    • 2015-06-13
    相关资源
    最近更新 更多