Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 我如何得到矩形,它将填充一个空间*不包括*其他一些矩形?_Algorithm_Rectangles - Fatal编程技术网

Algorithm 我如何得到矩形,它将填充一个空间*不包括*其他一些矩形?

Algorithm 我如何得到矩形,它将填充一个空间*不包括*其他一些矩形?,algorithm,rectangles,Algorithm,Rectangles,标题说明了一切。例如: 我想得到所有的绿色矩形,给定红色矩形。 我知道边界矩形的大小 红色矩形可能重叠。从图片中可以看出,矩形A填充了红色矩形1上方的所有空间 矩形B填充红色矩形1左侧的所有空间 矩形C填充红色矩形1右侧的所有空间 矩形D由两个红色矩形绑定 矩形(例如,G)填充空间的其余部分(顶部、右侧、底部) 算法似乎是,取每个红色矩形并填充其周围的空间。除非有其他限制,否则这似乎是一个过程。一个解决方案,为您提供了一种绿色矩形的可能性,不一定与图片中的相同,也不一定总是具有最小数量的矩形:

标题说明了一切。例如: 我想得到所有的绿色矩形,给定红色矩形。 我知道边界矩形的大小


红色矩形可能重叠。

从图片中可以看出,矩形A填充了红色矩形1上方的所有空间

矩形B填充红色矩形1左侧的所有空间

矩形C填充红色矩形1右侧的所有空间

矩形D由两个红色矩形绑定

矩形(例如,G)填充空间的其余部分(顶部、右侧、底部)


算法似乎是,取每个红色矩形并填充其周围的空间。除非有其他限制,否则这似乎是一个过程。

一个解决方案,为您提供了一种绿色矩形的可能性,不一定与图片中的相同,也不一定总是具有最小数量的矩形:

  • 获取位于红色矩形起点或终点的所有
    y
    s的排序列表
  • 在列表的开始处添加0,在列表的结尾处添加总高度
  • 对于每个(
    y1
    y2
    )间隔:
    • 检查哪些红色矩形位于
      y1
      y2
      之间的水平带中,按
      x
      坐标对它们进行排序
    • 创建左坐标和右坐标的排序列表:
      left\u list[i]
      将包含第i个矩形的左边界(类似于
      right\u list
      )。将0添加为
      右\u列表的第一个元素
      ,将总宽度添加为
      左\u列表的最后一个元素
    • 对于所有i,在x上的
      右列表[i]
      左列表[i]
      之间以及y上的
      y1
      y2
      之间创建一个绿色矩形

    • 最简单的解决方案如下

      创建两个列表
      xlist
      ylist
      ,对于每个红色矩形及其每个角,将该点的
      x
      坐标插入
      xlist
      ,将
      y
      坐标插入
      ylist
      。对边界框执行相同的操作

      xlist
      ylist
      中排序并删除重复项

      对于
      xlist
      中的每两个相邻元素
      x1
      x2
      ,以及
      ylist
      中的每两个相邻元素
      y1
      y2
      (两个嵌套的
      用于
      循环),使用坐标
      x1
      x2
      y1
      y2
      (除非新的绿色矩形与任何红色矩形重叠)

      这将为您提供比所需更多的绿色矩形,但您没有提供任何限制,因此,这里是;)


      如果您想限制矩形的数量,可以很容易地将相邻的绿色矩形合并成一行。

      这里有一个分治算法;这一想法大体上类似于。我假设矩形不重叠,并且它们都包含在边界框中,尽管边界可能接触

      • 如果边界框退化(即零宽度或零高度),则不执行任何操作
      • 否则,如果没有矩形,则只生成边界框本身
      • 否则:
        • 从列表中选择一个矩形作为“轴”
        • 为轴的“上方”、“左侧”、“右侧”和“下方”创建新的边界框
        • 通过过滤与每个新边界框相交的矩形列表,并将其剪切到边界框,构建轴“上方”、“左侧”、“右侧”和“下方”的矩形列表
        • 分别通过新的矩形列表递归细分“上方”、“左侧”、“右侧”和“下方”边界框
      每个矩形最多可以参与4个递归调用中的2个。如果轴是随机选择的,并且大多数矩形没有与大多数其他矩形垂直重叠,那么平均每个矩形都涉及一个递归调用。由于非递归工作需要线性时间,因此这种情况下的预期运行时间是O(n logn),其中n是矩形的数量

      Python中的一个实现:

      随机导入
      从集合导入namedtuple
      矩形=名称双('Rectangle','x1 y1 x2 y2')
      def相交(b,r):
      返回b.x1r.x1和b.y1r.y1
      def夹直线(b,r):
      返回矩形(
      最大值(b.x1,r.x1),最大值(b.y1,r.y1),
      最小值(b.x2,r.x2),最小值(b.y2,r.y2)
      )
      def片段(b,片段):
      return[clip_rect(b,r)]
      def分割矩形(b,矩形):
      如果b.x1>=b.x2或b.y1>=b.y2:
      通过
      如果不是矩形:
      产量b
      其他:
      #在典型情况下随机化以避免O(n^2)运行时
      #如果需要确定性行为,请更改此选项
      pivot=random.choice(矩形)
      上方=矩形(b.x1、b.y1、b.x2、枢轴点y1)
      左=矩形(b.x1,pivot.y1,pivot.x1,pivot.y2)
      右=矩形(pivot.x2,pivot.y1,b.x2,pivot.y2)
      下方=矩形(b.x1,pivot.y2,b.x2,b.y2)
      分割矩形的产量(上图,剪辑矩形(上图,矩形))
      分割矩形(左,剪辑矩形(左,矩形))的产量
      分割矩形(右,剪辑矩形(右,矩形))的产量
      分割矩形的产量(下方,剪辑矩形(下方,矩形))
      
      示例:如您所见,它没有使用最少数量的矩形,因为右侧有两个可以垂直连接在一起的矩形

      如果最小化矩形的数量是很重要的,你会想考虑不同的边界框:“上面”、“左边”、“右边”和“下面”,如果它们有两个相等的边,那么就把结果通过第二遍,把任何矩形连接在一起。