将两个重叠的矩形合并到生成的多边形中

时间:2014-04-02 08:56:32

标签: algorithm merge geometry rectangles

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

更具体一点:

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

提前感谢您提供任何帮助

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

  • 计算顶点质心(coords average)
  • 按照质心和顶点之间形成的角度以及经过质心的任何参考线(例如X轴)对顶点进行排序。

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

所以我回到其中一条评论中指出的解决方案,这里也有描述:

polygon union without holes

2 个答案:

答案 0 :(得分:1)

一旦你有4个顶点,你只需使用距离公式找到更远的点(因为看起来我们不能假设共线或未旋转的开始值)

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

float dist(Point a, Point b){
    float dx = a.x - b.x;
    float dy = a.y - b.y;
    return Math.sqrt(dx * dx + dy * dy);
}


//somewhere else, where u need it
//put point A into index 0
Point curFarthest = b;
float distance = dist(a, b);
if (dist(a, c) > distance){
    curFarther = c;
    distance = dist(a, c);
} else if (dist(a, d) > distance){
    curFarther = d;
    curFarthest = dist(a, d);
}

//store curFarthest into index 2
// store the rest (exculding points a and curFarthest)
// into index 1 and 3 in no particular order

答案 1 :(得分:0)

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

  1. 找到交叉点。
  2. 每个点(顶点)与其相邻连接点的距离。
  3. 使用Dinics算法找到Maxmimum流。
  4. 注意:会有一些特殊情况。但是,我的问题再次围绕具有1个共同点(顶点)的多边形。