给定大矩形R内的小矩形r[ ],是否存在一种最优快速算法来确定填充r[ ]之间"negative space"的最小矩形数量?
例如,给定这三个蓝色矩形在紫色矩形内:
我如何快速确定像下面这样的绿色矩形列表(可能不是最佳配置,因此我发布了帖子):
给定大矩形R内的小矩形r[ ],是否存在一种最优快速算法来确定填充r[ ]之间"negative space"的最小矩形数量?
例如,给定这三个蓝色矩形在紫色矩形内:
我如何快速确定像下面这样的绿色矩形列表(可能不是最佳配置,因此我发布了帖子):
V-E+F=1+#连接组件。
0123456789abc
0+-----------+
1| |
2| +--+ |
3| |R | +-+ |
4| +--+ |S| |
5| | | |
6| +--+ | | |
7| |T | +-+ |
8| +--+ |
9+-----------+
我们正在从上到下运行一条扫描线。这些事件是:
# (y, whichside, xmin, xmax)
(2, top, 3, 6) # R
(3, top, 8, a) # S
(4, bot, 3, 6) # R
(6, top, 2, 5) # T
(7, bot, 8, a) # S
(8, bot, 2, 5) # T
# (xmin, xmax, ymin)
(0, c, 0)
现在我们开始处理事件。首先是 (2, top, 3, 6)。我们发现它嵌套在目前唯一的绿色矩形内,即 (xmin=0, xmax=c, ymin=0, ymax=2)。(只要蓝色矩形不相交,蓝色区间总是嵌套的。)我们在蓝色矩形两侧各开始一个新的绿色矩形,并且搜索树包含
(0, 3, 2) (6, c, 2)
(0, 3, 2) (6, 8, 3) (a, c, 3)
现在我们处理(4, bot, 3, 6)。这将结束其左右两侧的绿色矩形,(xmin=0, xmax=3, ymin=2, ymax=4)和 (xmin=6, xmax=8, ymin=3, ymax=4)。搜索树为
(0, 8, 4) (a, c, 3)
0123456789abc
0+-----------+
1| |
2+--+--+-----|
3| |R |-+-+-|
4+--+--+-|S| |
5| | | |
6+-+--+--+ | |
7| |T +--+-+-+
8+-+--+------+
9+-----------+
关于处理退化情况的说明:将具有相同y坐标的顶部事件放在底部事件之前,并抑制面积为零的矩形。通常仍会存在“不必要”的矩形,更复杂的事件处理器可以避免这种情况(通过同时处理给定y坐标处的所有事件)。