将剩余的矩形空间拆分成矩形

时间:2017-08-04 23:43:45

标签: algorithm geometry 2d

考虑到较大矩形内部的一些矩形,是否有任何算法将剩余空间分割成矩形,并且最好尽可能少?

Before After

2 个答案:

答案 0 :(得分:0)

使用bsp树:在树中插入每个矩形边。这会将空间划分为凸子集。由于您的输入是矩形,因此凸子集只能是矩形(https://en.wikipedia.org/wiki/Binary_space_partitioning)。

请注意,分区取决于插入边的顺序。

我不确定这会给你最小数量的矩形,但你会接近。

答案 1 :(得分:0)

解决问题的一种方法是将矩形缩小为网格。每个矩形角变为顶点(x,y),每个矩形的边是引用两个顶点的线。在一条线上的顶点(例如,两个矩形在触摸)必须在该顶点处分割线。可能只有一条线连接任意两个顶点。包含了边界矩形。

将矩形转换为网格后,每个顶点计算使用该顶点的线数。

如果一个顶点只有2条线连接它并且不是一个边界角,那么它必须被扩展,它将有两个可选方向,水平和垂直。没有规则哪个方向最好,所以选择随机方向。在那个方向上,远离到达顶点的线,将顶点添加到最近的相交线。继续该过程,直到没有顶点(除了边界角)连接的线数少于3条。

现在从最左上角的顶点开始,沿顺时针方向追踪线条,每4行是一个矩形当你回到起始顶点时你有一个新的矩形使用min和x和y方向上的最大顶点坐标,用于定义矩形的大小。对于每一行,将其顶点行数减1.当顶点的行数为零时,删除顶点;删除所有顶点后,您就完成了。

这将创建可能的最小矩形数。

要知道解决方案是否是最小矩形计数,请检查每个顶点是否只有3条线连接它(您的示例图像是最小矩形数,因为没有顶点有超过3条线连接它)

此规则的唯一例外是现有的矩形在拐角处接触。只有现有顶点可能有4条线连接。