布置有向无环图的算法?

时间:2019-02-25 18:31:32

标签: d3.js svg layout rendering directed-acyclic-graphs

我正在尝试找到一种以干净,严格的基于网格的方式呈现DAG的方法,并且这种方法非常简短。

我想渲染看起来像这样的东西:

                   ┌───────────┐      ┌───────────┐
               ┌───│     b     │─────▶│     d     │
               │   └───────────┘      └───────────┘
               │                                   
┌───────────┐  │   ┌───────────┐      ┌───────────┐
│     a     │◀─┼──▶│     c     │──┬──▶│     e     │
└───────────┘  │   └───────────┘  │   └───────────┘
               │                  │                
               │                  │   ┌───────────┐
               └──────────────────┴──▶│     f     │
                                      └───────────┘

这将是以下依赖性的图形表示:d(b), b(a), e(c), f(c), c(a)。 (box(depends on)

我已经对“力导向”图进行了广泛的研究,但这似乎没有必要,因为我有两个约束,它们应严格位于网格上,而不是严格分层。

我无法找到有关布局算法设计的足够文献的替代方法包括对“树形布局”,“过程布局”,“决策布局”的各种理解(请参见here

我的最终目标是为d3(或类似产品)制作一个布局引擎,以进行交互式交互:

example of layout from sketch.app mock-up

到目前为止,我最好的理论是:

  1. 遍历图形,找出有多少列,如果视口太多,则考虑折叠最左边的项目。

  2. 开始将内容放置在列中,将最长链的内容放置在更右端,而较小或没有链的内容放置在左端。

  3. 如果列中的某项在同一列中具有依赖项,请将所有列移到左侧,并允许该依赖项代替它。

  4. 画线,如果算法仅考虑宽泛的“网格位置”而不是绝对像素值,这应该很容易,而从A1(单元格{{1 }})到a(单元格B1);

c

我的方法基本正常吗?我该如何解决这个问题?有人会建议在编写诸如此类的布局引擎时读什么书?

0 个答案:

没有答案