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

Algorithm 将两个重叠的矩形合并到生成的多边形中,algorithm,merge,geometry,rectangles,Algorithm,Merge,Geometry,Rectangles,我正在寻找一种算法,给定两个部分或全部重叠的矩形,查找顶点的有序列表,该列表定义了表示两个矩形之和的多边形 更具体地说: 我有两个有序的点列表作为输入,代表两个矩形 我知道如何找到结果多边形的顶点,该多边形由每个矩形的顶点(位于另一个矩形之外)加上一个矩形的每条边与另一个矩形的每条边之间的交点组成 我目前不知道如何将如上所述获得的点排序到数组中,以便数组的元素j和j+1表示同一条边的两个顶点(这就是我所说的顶点有序列表) 提前谢谢你的帮助 更新: 我找到了一种对顶点排序以获得多边形的方法,如

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

更具体地说:

  • 我有两个有序的点列表作为输入,代表两个矩形
  • 我知道如何找到结果多边形的顶点,该多边形由每个矩形的顶点(位于另一个矩形之外)加上一个矩形的每条边与另一个矩形的每条边之间的交点组成
  • 我目前不知道如何将如上所述获得的点排序到数组中,以便数组的元素j和j+1表示同一条边的两个顶点(这就是我所说的顶点有序列表)
提前谢谢你的帮助

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

  • 计算顶点质心(coords平均值)
  • 根据从质心到顶点的线段与通过质心的任何参考线(例如X轴)之间形成的角度对顶点进行排序
然而,尽管我始终获得一个包含两个矩形的多边形,没有孔或相交边,但它并不总是我想要的多边形(有时它包括不属于其中一个输入矩形的额外区域)

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


一旦有了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 浮动距离(点a、点b){ 浮点数dx=a.x-b.x; 浮动dy=a.y-b.y; 返回Math.sqrt(dx*dx+dy*dy); } //在别的地方,在你需要它的地方 //将点A放入索引0中 最远点=b; 浮动距离=距离(a,b); if(距离(a,c)>距离){ 电流=c; 距离=距离(a,c); }否则如果(距离(a,d)>距离){ curd=d; curfartest=距离(a,d); } //将curvest存储到索引2中 //储存其余部分(a点和最远点) //不按特定顺序进入索引1和索引3
我正在处理相同的问题,但我使用了不同的方法(工作仍在进行中)

  • 找到交点
  • 每个点(顶点)与其相邻连接点的距离
  • 用Dinics算法求最大流

  • 注:将有一些特殊情况。但我的问题还是围绕着有一个公共点(垂直点)的多边形

    这是相似的tohttp://stackoverflow.com/questions/8011267/area-of-rectangle-rectangle-intersection/8011422#8011422,基本上都是一样的,只是不同的转弯规则。是的,我没有读到答案,但我已经尝试过类似的方法,但在拐角处遇到了绊脚石,特别是当一个矩形的某个顶点位于另一个的边上时,这两个矩形的构造方式经常发生。因此,我将方法切换到问题中概述的方法,认为这样会减少角落案例。如果这不起作用,也许我会回到第一个解决方案,并尝试解决角落案例。是的,角落案例增加了复杂性,毫无疑问。我不确定我是否理解你的意思,但无论如何,谢谢。两个矩形的合并不是一个矩形,而是一个通常具有5个以上顶点的非凸多边形,因此我有4个以上的点要处理。另请参见我的问题的更新。