Algorithm 我如何得到矩形,它将填充一个空间*不包括*其他一些矩形?
标题说明了一切。例如: 我想得到所有的绿色矩形,给定红色矩形。 我知道边界矩形的大小Algorithm 我如何得到矩形,它将填充一个空间*不包括*其他一些矩形?,algorithm,rectangles,Algorithm,Rectangles,标题说明了一切。例如: 我想得到所有的绿色矩形,给定红色矩形。 我知道边界矩形的大小 红色矩形可能重叠。从图片中可以看出,矩形A填充了红色矩形1上方的所有空间 矩形B填充红色矩形1左侧的所有空间 矩形C填充红色矩形1右侧的所有空间 矩形D由两个红色矩形绑定 矩形(例如,G)填充空间的其余部分(顶部、右侧、底部) 算法似乎是,取每个红色矩形并填充其周围的空间。除非有其他限制,否则这似乎是一个过程。一个解决方案,为您提供了一种绿色矩形的可能性,不一定与图片中的相同,也不一定总是具有最小数量的矩形:
红色矩形可能重叠。从图片中可以看出,矩形A填充了红色矩形1上方的所有空间 矩形B填充红色矩形1左侧的所有空间 矩形C填充红色矩形1右侧的所有空间 矩形D由两个红色矩形绑定 矩形(例如,G)填充空间的其余部分(顶部、右侧、底部)
算法似乎是,取每个红色矩形并填充其周围的空间。除非有其他限制,否则这似乎是一个过程。一个解决方案,为您提供了一种绿色矩形的可能性,不一定与图片中的相同,也不一定总是具有最小数量的矩形:
- 获取位于红色矩形起点或终点的所有
s的排序列表李>y
- 在列表的开始处添加0,在列表的结尾处添加总高度李>
- 对于每个(
,y1
)间隔:y2
- 检查哪些红色矩形位于
和y1
之间的水平带中,按y2
坐标对它们进行排序x
- 创建左坐标和右坐标的排序列表:
将包含第i个矩形的左边界(类似于left\u list[i]
)。将0添加为right\u list
,将总宽度添加为右\u列表的第一个元素
左\u列表的最后一个元素
- 对于所有i,在x上的
和右列表[i]
之间以及y上的左列表[i]
和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)
分割矩形的产量(上图,剪辑矩形(上图,矩形))
分割矩形(左,剪辑矩形(左,矩形))的产量
分割矩形(右,剪辑矩形(右,矩形))的产量
分割矩形的产量(下方,剪辑矩形(下方,矩形))
示例:如您所见,它没有使用最少数量的矩形,因为右侧有两个可以垂直连接在一起的矩形
如果最小化矩形的数量是很重要的,你会想考虑不同的边界框:“上面”、“左边”、“右边”和“下面”,如果它们有两个相等的边,那么就把结果通过第二遍,把任何矩形连接在一起。