如何找到由各种 2D 矩形组合创建的边框长度?

How to find the border length created from a conglomeration of various 2D rectangles?

给定一组矩形,要求你确定由重叠矩形的轮廓形成的复杂多边形的周长。

  • 我们从各个较小的重叠矩形的(所有 4 个点的)位置开始。
  • 我们通过遍历各个矩形的角点来构造新的多边形。
  • 我们找到矩阵的任何给定行或列遇到的最外围点(最远 North/South/East/West),将它们存储在单独的数组中。
  • 一旦我们收集了新多边形的所有点,我们就会围绕网格中心按顺时针顺序对它的点进行排序(如果尚未排序)。
  • 我们通过测量其表面上每条线(每组连续点之间)的距离并将其加到总数来测量其周长。
 .  .  .  .  .  .  .  .  .  .  .  .
 .  .  .  .  *  x  x  *  .  .  .  .
 .  .  .  .  x  .  .  x  .  .  .  .
 .  .  .  .  x  .  .  x  .  .  .  .
 .  .  *  z  *  z  .  x  .  .  .  .
 .  .  z  .  x  z  .  x  .  .  .  .
 .  .  z  .  x  z  .  x  .  .  .  .
 .  *  *  y  y  y  y  *  y  y  *  .
 .  y  z  .  x  z  .  x  .  .  y  .
 .  *  *  y  y  y  y  *  y  y  *  .
 .  .  z  .  x  z  .  x  .  .  .  .
 .  .  z  .  x  *  x  *  .  .  .  .
 .  .  z  .  .  z  .  .  .  .  .  .
 .  .  *  z  z  *  .  .  .  .  .  .
 .  .  .  .  .  .  .  .  .  .  .  .

在上图中,我们有矩形 x、y 和 z。星号是我们新多边形的边角。

矩形是否轴对齐?如果是这样,你可以试试这个。沿一个轴(假设为 x)排序开始和结束,然后维护一个连续间隔列表 - 点,按 y 排序,每个间隔都有一个整数 'winding number'(最初是 ymin..ymax,0)。然后,当您沿着 x 处理下一条边时,您会发现它与现有间隔重叠,将两端的间隔分开,并更新(++ 用于前缘,-- 用于后缘)它们的缠绕数。例如:

 0000111111122222111000
+000++++++++++000000000
=0001222222233222111000
    1                   (perimeter update)

对于开放的 eges,将绕组编号为 1 的新间隔添加到周边。对于关闭 - 为 0。为了提高效率,您还可以合并具有相同绕组数的区间。

然后对 y 做同样的事情。

在 Preparata 和 Shamos 的书 "Computational Geometry" 中,第 8 章专门讨论矩形并集问题。联合周长问题用扫线算法(link one link two)和线段树在O(NLogN)时间内解决

Addition