0

假设我有自己的标记语言,它允许我使用一组 TextElements 和 ImageElements。它们中的每一个都可以具有诸如“float:left/right/none”和“clear:none/left/right/both”之类的属性。此外,非浮动元素可以在浮动元素周围流动。基本上,都喜欢 CSS 浮动布局。

例如:

Elem1 Elem2 Elem3 Elem4 Elem5 _ Elem6

在我布置这些元素时,用于存储这些元素的最佳数据结构是什么?我需要一些可以轻松回答以下问题的东西:

  • 是否有足够的空间容纳 Element1 的左侧或右侧的 Element2?
  • Element1的页面坐标,原点和大小是多少?

我将基本上存储一个结构,如:

{元素,原点(x,y),大小(w,h)}

对于此数据结构中的每个已布局的元素。

有诸如 RTrees、QuadTrees 之类的东西,但我想要一些简单的东西来抽象地表示页面上矩形的布局,以便在我的布局算法中使用。

注意:我不是在 HTML 中这样做,它是用于 iOS 应用程序中的元素布局,并且我不能使用 iOS 6 约束,因为我需要支持早期的 iO​​S 版本。

谢谢!

4

1 回答 1

0

我相信可以使二进制堆满足您的需求。维基百科很好地解释了二进制堆。

二叉堆有两个属性可以满足你的需求:

  1. 它是一棵完整的树,在结构上类似于元素的布局页面。
  2. 对节点进行排序,使得每个节点都大于(或小于,取决于您想要的)其子节点。在您的情况下,“更大”是指“放置在更左侧和顶部”。

您有一个元素列表,在没有浮动的情况下,这些元素将按顺序排列,并根据需要换行。因此,在没有浮点数的情况下构建堆只会按照接收到的顺序将节点添加到树中。

浮点数使这一点复杂化,因为它们的位置高于它们之前的节点(或者在右浮点数的情况下低于它们后面的节点)。幸运的是,通过将新节点冒泡到适当的位置来构建堆可以实现这一点。因此,只要您可以定义一个函数来相对于其对等元素对浮动元素进行排序,就可以工作。

如果我不确定,不幸的,我现在没有足够的时间更全面地探索这个想法。

无论如何,假设您有一个正确的堆,重复删除最顶部的元素应该按照它们应该放置在页面上的顺序枚举节点。

我认为CHDataStructures有一个二进制堆,但我无法验证这一点,因为保存文档的服务器在发布时似乎处于脱机状态。

祝你好运,我希望这会有所帮助。

于 2012-11-28T07:10:35.307 回答