Rap*_*elH 19 graph directed-graph dot graphviz
有关Graphviz Library中dot的算法是否有任何文档(完整的伪代码?)?
我只找到了一些部分伪代码文档.
Rod*_*Rod 32
以下是一些参考资料.最完整的(缺少点源代码本身)可能是#2,文章"绘制有向图的技术",由几个Graphiz贡献者自己编写.
在使用点绘制图形时,点的布局算法如下所述:
dot在四个主要阶段绘制图表.了解这一点有助于您了解dot所做的布局类型以及如何控制它们.点使用的布局过程依赖于图形是非循环的.因此,第一步是通过反转某些循环边缘的内部方向来破坏输入图中出现的任何循环.下一步将节点分配给离散的排名或级别.在从上到下的图形中,等级确定Y坐标.跨越多个等级的边缘被分成"虚拟"节点和单位长度边的链.第三步命令级别内的节点以避免交叉.第四步设置节点的X坐标以保持边缘短,最后一步设置边缘样条.基于Warfield [War77],Carpano [Car80]和Sugiyama [STT81]的工作,这与大多数层次图绘制程序的通用方法相同.我们将读者推荐给[GKNV93]以获得对dot算法的详尽解释
该段引用的论文如下:
[Car80] M. Carpano.自动显示用于计算机辅助决策分析的分层图.IEEE软件工程学报,SE-12(4):538 - 546,1980年4月.(显然可以在这里购买.)
[GKNV93] Emden R. Gansner,Eleftherios Koutsofios,Stephen C. North和Kiem-Phong Vo.一种绘制有向图的技术.IEEE Trans.Sofware Eng.,19(3):214 - 230,1993年5月.(可在 Graphviz.org网站上找到.)
[STT81] K.Sugiyama,S.Tagawa和M. Toda.分层系统结构的视觉理解方法.IEEE Transactions on Systems,Man,and Cybernetics,SMC-11(2):109-125,1981年2月.(显然可以在这里购买.)
[War77] John Warfield.交叉理论与层次映射.IEEE Transactions on Systems,Man,and Cybernetics,SMC-7(7):505 - 523,1977年7月.(显然可以在这里购买.)
dot的算法在1993年的IEEE Transactions on Software Engineering期刊上发表的论文"A Drawing for Drawing Directed Graphs"中有详细描述(可在Graphviz.org网站上免费获得).这是上面引用的"[GKNV93]"来源.
摘要,它的价值在于:
我们描述了用于绘制有向图的四遍算法.第一遍使用网络单纯形算法找到最佳秩分配.第二遍通过迭代启发式设置排名内的顶点顺序,该迭代启发式结合了新的权重函数和局部转置以减少交叉.第三遍通过构造和排列辅助图来找到节点的最佳坐标.第四遍使样条线绘制边缘.该算法可以很好地绘制图纸并快速运行.
"使用Graphviz作为库"在3.1节中提供了每个布局引擎的算法的摘要.点的部分描述是这样的:
如果可能,点算法产生关于边缘方向的图的排序布局.它特别适合显示层次结构或有向非循环图.基本布局方案归功于Sugiyama等人[STT81]点使用的特定算法遵循Gansner等人[GKNV93]描述的步骤.
点布局中的步骤是:1)初始化2)秩3)mincross 4)位置5)相同的端口6)样条7)复合边界
在初始化之后,算法使用整数程序将每个节点分配给离散等级(等级)以最小化(离散)边长度的总和.下一步(mincross)重新排列等级内的节点以减少边缘交叉.接下来是实际坐标到节点的分配(位置),使用另一个整数程序来压缩图形并拉直边缘.此时,所有节点都将在coord属性中设置位置.另外,设置所有簇的边界框bb属性.
"[GKNV93]"参考是如上所述的"绘制有向图的技术".
"[STT81]"参考如上所述的"用于视觉理解分层系统结构的方法".
Graphviz的文档索引,其中包含详细文档和其他背景材料的链接.
Graphviz的"理论"页面链接到更多的背景材料.
在用于原始源代码dot
,其可在GitHub.
关于d3.js Google Group的一些相关讨论.