Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 最优柔性箱布局算法_Algorithm_Optimization_Layout - Fatal编程技术网

Algorithm 最优柔性箱布局算法

Algorithm 最优柔性箱布局算法,algorithm,optimization,layout,Algorithm,Optimization,Layout,我正在实现W3C定义的,类似于。虽然这些标准规定了模型应该如何运行,但它们没有给出应该如何实现的任何细节 我感兴趣的模型部分有: 盒子有宽度和高度 框可以包含其他框 容器盒(父盒)负责调整其包含的盒(子盒)的大小和位置 盒子的方向可以是水平的,也可以是垂直的。方向确定子框的位置和大小 子框可以是灵活的,也可以是不灵活的。如果子框不灵活,则按“宽度”和“高度”参数中指定的大小绘制。如果它是灵活的,则会调整其大小以适应父容器中的可用空间 灵活性是相对于同一容器中的其他子框而言的,灵活性较高的框的大小

我正在实现W3C定义的,类似于。虽然这些标准规定了模型应该如何运行,但它们没有给出应该如何实现的任何细节

我感兴趣的模型部分有:

  • 盒子有宽度和高度
  • 框可以包含其他框
  • 容器盒(父盒)负责调整其包含的盒(子盒)的大小和位置
  • 盒子的方向可以是水平的,也可以是垂直的。方向确定子框的位置和大小
  • 子框可以是灵活的,也可以是不灵活的。如果子框不灵活,则按“宽度”和“高度”参数中指定的大小绘制。如果它是灵活的,则会调整其大小以适应父容器中的可用空间
  • 灵活性是相对于同一容器中的其他子框而言的,灵活性较高的框的大小比灵活性较低的框大
  • 子框可以约束为最小或最大大小。如果子框是灵活的,则父框的大小将永远不会小于最小大小或大于最大大小
  • 功能1-5可以非常有效地实现。功能6是有问题的,因为我能想到的最有效的算法是非常幼稚的。该算法的工作原理如下:

  • 将所有框放入列表中
  • 循环遍历每个子框并使用灵活性调整其大小,以确定调整大小所需的量
  • 如果大小超过某个限制,则将框大小设置为该限制,并将其从列表中删除,然后从列表的开头开始
  • 第三步是效率下降的地方。例如,如果列表中有十个项目,而最后一个项目有一个约束,则算法会计算前九个项目的大小,然后当它达到第十个项目时,需要重新进行所有计算。我考虑过保持列表的排序,并首先调整所有受约束的框的大小,但是这会增加复杂性和列表排序的开销


    考虑到这是浏览器和框架(XUL、.Net、Flex等)中相当常见的功能,我希望有一个公认的最佳解决方案。

    大多数盒子/容器布局算法使用2次通过算法。在.NET(WPF)的情况下,它们被称为“度量”和“安排”。每个控件都可以测量其内容,并在递归测量过程中报告“所需大小”

    在第二次传递(排列)过程中,如果子对象的所需大小不适合父对象,则父对象使用其布局算法为每个子对象提供实际大小,例如,通过指定按所需大小加权的实际大小。最小/最大尺寸、盒子灵活性等可以在这里发挥作用

    有关WPF布局系统的更多信息

    Xul布局

    +1获取有趣的链接和信息。我目前正在做两个过程,问题是在排列阶段,而在这个阶段发生的事情正是我试图优化的。排列阶段应该是使用一些映射函数(布局算法)从所需大小到实际大小的简单映射。例如,如果要将两个宽度为60的子对象放入宽度为100的对象中,则可以在公平赋值中使用{50,50},或者在另一个赋值函数中使用{60,40}。您是否将布局视为“调整大小”操作,而不是“分配新大小”的操作?在布局过程中,子级拥有的任何旧尺寸都应该是无关的,对吗?对,每个布局过程都是唯一的。我不能使用您描述的简单映射的原因是由于最小/最大大小限制。例如,给定两个宽度为40的子对象,其中一个可以约束为最大宽度为60。当两个子对象都安装到200宽的区域中时,受约束的子对象必须为60,而另一个子对象可以扩展到140。在正常过程中,它将尝试为两个框指定100的宽度。遇到受约束的长方体时,需要重新计算非受约束的长方体。难道没有办法只进行一次所有的计算吗?如果您想将两个都过满的子项分配到一个200宽的区域中,并且第一个子项的最大宽度为60,那么它们所需的大小将是{60200}。您可以通过多种方式分配这些所需的大小:“第一次供应”:{60140}。“所需重量”:{46154}。“先到先得”的问题是,如果顺序颠倒,赋值将是{200,0},这是不可取的。一个折衷的方法是做一个2遍的安排,从一个公平的{100100}开始,然后钳制到最小/最大大小,以达到{60100},最后分配{60140}的无约束子代的空闲时间。我认为您应该参考WPF网格列宽分配算法。首先看一下列定义是如何生成的,然后也许试着看一下度量/排列代码的实现(我通过一个反射器,比如Jetbrains DotPeek或RedGate的反射器来查看它)。首先,你应该问问自己尺寸的定义是什么。它们是“理想尺寸”吗?或测量尺寸(如果它们本身包含子对象)。wpf列有3种不同的设置:fixed/auto/star,我认为这很有意义。