使用最左边的坐标从左到右对矩形进行排序,如下图所示:
然后,从左到右遍历每个矩形,并查看它们与左侧的哪些矩形垂直重叠(即,如果将它们向左移动,它们会碰到哪些矩形)。
A 和 B 到达左侧窗口边缘,而不会碰到任何其他矩形。
C撞到A。
D撞到B。
E 撞到 A、C 和 D。
F 撞到 B、D 和 E。
G 撞到 D、E 和 F。
H 撞到 A、C 和 E。
我撞到了 B、D 和 F。
J 撞到 D、E、F 和 G。
使用此信息构建如下图所示。当一个矩形撞到其他几个矩形时,例如E 撞到 A、C 和 D,这些矩形本身就是同一分支的一部分,例如A和C,然后只连接到最右边的矩形,即矩形C。
然后,将每个矩形的宽度(以像素为单位)存储在图形中。然后我们将尝试找到边的权重 X,它表示矩形之间的空间宽度。
要做到这一点,我们需要在图中找到许多路径。首先,我们搜索最长的路径,即矩形最多的路径,而不考虑它们的宽度;在示例中是:
左窗口边缘 → A → C → E → F → G → J
左窗口边缘 → B → D → E → F → G → J
然后我们检查哪些路径的组合宽度最大:
左窗口边缘 → A → C → E → F → G → J = 240
然后我们看看更短的路径,看看它们是否有更大的宽度:
左窗口边缘 → A → C → E → F → I = 230
左窗口边缘 → B → D → E → F → I = 220
左窗口边缘 → A → C → E → H = 168
左窗口边缘 → B → D → E → H = 158
在示例中,较短的路径都没有较大的宽度。如果他们中的一些人这样做,我们也必须考虑每个长度的最宽路径。事实上,我们只需要查看路径:
左窗口边缘 → A → C → E → F → G → J = 240
将此路径连接到右侧窗口边缘,使其具有额外的边缘;现在有 7 个宽度为 X 的边。矩形的组合宽度为 240 像素,所以如果窗口是例如450 像素宽,然后 X = (450 - 240) / 7 = 30 像素。
如果要考虑多条路径,您将采用 X 的最小结果。
路径中 X 的最小结果的矩形之间将有正好 X 个像素的空间;其他矩形有一些回旋余地。您可以输入 X 作为图中最长路径中边的权重,然后使用该图进一步计算其他矩形的等间距。或者你可以把它们放在离它们的左邻或右邻距离 X 的地方。
对于更复杂的情况,假设在示例中矩形 I 的宽度为 90 像素,矩形 H 的宽度为 120 像素。这些是路径:
6 个矩形:
左窗口边缘 → A → C → E → F → G → J = 240
左窗边 → B → D → E → F → G → J = 230
5 个矩形:
左窗口边缘 → A → C → E → F → I = 254
左窗口边缘 → B → D → E → F → I = 244
4 个矩形:
左窗口边缘 → A → C → E → H = 250
左窗口边缘 → B → D → E → H = 240
那么要考虑的路径是:
左窗口边缘 → A → C → E → F → G → J = 240
因为它是具有最多 (6) 个矩形的路径中最宽的,并且:
左窗口边缘 → A → C → E → F → I = 254
因为它是 5 个矩形的路径中最宽的,并且比 6 个矩形的路径更宽。
(最宽的4-矩形路径比6-矩形路径宽,但不比5-矩形路径宽,所以可以忽略。)
这给出了条件:
240 + 7 × X = W
254 + 6 × X = W
所以对于窗口宽度 290,这将给出:
240 + 7 × X = 290 → X = 7
254 + 6 × X = 290 → X = 6
所以路径 A → C → E → F → I 确定了空间的宽度,为 6 个像素。
但是对于宽度为 390 的窗口,这将给出:
240 + 7 × X = 390 → X = 21
254 + 6 × X = 390 → X = 22
所以现在路径 A → C → E → F → G → J 确定了空间的宽度,为 21 像素。