GraphViz DOT 输出:"edge" 的 4-6 "pos" 坐标是什么

GraphViz DOT output: What are the 4-6 "pos" coordinates for an "edge"

我刚开始尝试使用 GraphViz 的“neato”命令 Kamada-Kawai 图形可视化(使用压力专业化解决)。 我对提取布局节点特别感兴趣 外部处理的坐标。

我在看这个 问题 找出输出 DOT 中图边的“pos”属性 文件。该属性由 4 个坐标点组成。一个有帮助 answer 表示 一系列坐标(不一定是 4 个)是 a 的控制点 样条曲线,可能是 Bezier 样条。 回答者是“复眼”,我称之为“CE”。这是 给出的例子:

// digrfG.dot
//-----------
digraph G {

   A [label = "A"  xlabel="a" pos="0,100" ]
   B [label = "B"  xlabel="b" pos="100,0"]

   A -> B  [label = "A->B www"  xlabel="a->b"]
   [pos="0,100 0,0 0,0 100,0"]

}

在Bash中,由GraphViz处理使用:

# Make image:
#------------
dot -Kneato -n2 -Tpng digrfG.dot >| digrfG.png

# Make output DOT file:
#----------------------
dot -Kneato -n2       digrfG.dot >| digrfG_out.dot

输出为:

# digrfG_out.dot
#---------------
digraph G {
   graph [bb="-7,0,154,151"];
   node [label="\N"];
   A [height=0.5, label=A, pos="27,118",
      width=0.75, xlabel=a, xlp="-3.5,143.5"];
   B [height=0.5, label=B, pos="127,18",
      width=0.75, xlabel=b, xlp="96,43.5"];
   A -> B [label="A->B www", lp="42.5,75.5",
           pos="27,118 27,18 27,18 127,18",
           xlabel="a->b", xlp="63.5,60.5"];
}

我的边缘坐标不匹配 CE's,既不在 数值量也不在坐标数中。虽然我有 4 坐标,CE有6个,包括2个开头的坐标 以“s”和“e”为前缀的系列。 贝塞尔曲线 页 被 CE 引用给人的印象是典型的贝塞尔样条有 4 控制点,包括 起点和终点,虽然数学 允许更多。 这个微软 页 强化了这种 4 分违约的印象。

这个GraphViz page 表明 一条边的“pos”属性包含一条样条曲线,以 start 和 根据 CE 的输出,端点以“s”和“e”为前缀,但 语法令人费解。如果是正则表达式语法,那么就有 可选 起点和终点后有 4 个或更多坐标。 这或许可以解释为什么我没有以“s”为前缀的坐标,或者 “e”,但我有 4 个坐标。

在上面的digrfG_out.dot中,如果我将4个坐标与 节点坐标,很明显第4个中的第一个和最后一个 坐标匹配节点坐标。 好像是CE的GraphViz 默认为 6 个控制点并明确指定开始和结束 指向坐标列表的头部,而我的 GraphViz 默认为4,不对开始和结束做特殊处理 points.GraphViz 的样条 page 是这样的 模棱两可,我想知道这个解释是否可以得到证实。

谢谢。

我建议跳过 CE 的解释(不一定是错误的,但可能含糊不清)并转到 Graphviz 网站上的源代码。
是的,贝塞尔曲线每个“段”(我的术语)需要 4 个点,但一个段中的最后一个点也用作下一个段中的第一个点。 Graphviz 的箭头使用单独的点 - 作为箭头的一端。

可选的 s(开始)和 e(结束)点用于可选箭头。然后是 4 个必填点,然后是可选的 3 个点。 参见第 36 页 https://www.graphviz.org/pdf/dotguide.pdf, https://forum.graphviz.org/t/how-to-control-the-points-of-splines/1087, and https://forum.graphviz.org/t/fun-with-edges/888 - in addition to the (yes, regular expression) http://www.graphviz.org/docs/attr-types/splineType/
希望对您有所帮助。

任何边都可以有箭头,即使在 non-directed 图中也是如此。 Digraph 只是设置默认值(箭头或无箭头)。 dir 属性 (https://graphviz.org/docs/attrs/dir/) 显式设置箭头。
最后,箭头形状(https://graphviz.org/doc/info/arrows.html)可以是“none”。

graph {
  A--B [dir=forward]
  C--D [dir=back]
  E--F [dir=both]
  G--H [dir=none]
}

Dot 产生这个: