端口

边的起点和终点

在我们继续讨论布局的相对方向和绝对方向之前,我们先来看一看节点的端口数目和边的条数;

..................................................
:      :       :       :       :     :     :     :
: 0,0  :north,0:north,1: 3,0   : 4,0 : 5,0 : 6,0 :
:      :left,0 :left,1 :       :     :     :     :
:      :       :       :       :     :     :     :
..................................................
:      :+-------------+:       :     :     :     :
:west,0:|             |:east,0 : 4,1 : 5,1 : 6,1 :
:back,1:|             |:front,0:     :     :     :
:      :|             |:       :     :     :     :
........|    Node     |...........................
:      :|             |:       :     :     :     :
:west,1:|             |:east,1 : 4,2 : 5,2 : 6,2 :
:back,1:|             |:front,1:     :     :     :
:      :+-------------+:       :     :     :     :
.................................................
:      :       :       :       :     :     :     :
: 0,3  :south,0:south,1: 3,3   : 4,3 : 5,3 : 6,3 :
:      :right,0:right,1:       :     :     :     :
:      :       :       :       :     :     :     :
.................................................

可以给节点的每一条都命名,之所以每一个边都有两个名字(比如北和左)和整个图或者分组有关;使用绝对方向的话,那么这个边的方向就与节点的方向无关;比如南方永远是南方;但是,如果使用相对方向的话,那么就是相对当前节点的前方;比如右边指的是当前节点前方然后向右;下面是一个具体的例子:

[ C ] -> { start: south; } [ S ] { origin: C; offset: 0,2; }
[ C ] -> { start: north; } [ N ] { origin: C; offset: 0,-2; }
[ C ] -> { start: east; }  [ E ] { origin: C; offset: 2,0; }
[ C ] -> { start: west; }  [ W ] { origin: C; offset: -2,0; }
          +---+
          | N |
          +---+
            ^
            |
            |
+---+     +---+     +---+
| W | <-- | C | --> | E |
+---+     +---+     +---+
            |
            |
            v
          +---+
          | S |
          +---+
[ C ] -> { start: right; } [ R ] { origin: C; offset: 0,2; }
[ C ] -> { start: left; }  [ L ] { origin: C; offset: 0,-2; }
[ C ] -> { start: front; } [ F ] { origin: C; offset: 2,0; }
[ C ] -> { start: back; }  [ B ] { origin: C; offset: -2,0; }
          +---+
          | L |
          +---+
            ^
            |
            |
+---+     +---+     +---+
| B | <-- | C | --> | F |
+---+     +---+     +---+
            |
            |
            v
          +---+
          | R |
          +---+

上面的两个图看起来是一样的,好像使用向右和向南并没有什么区别,但是,如果改变整个图的方向,就会有一些区别了:

graph { flow: down; }

[ C ] -> { start: south; } [ S ] { origin: C; offset: 0,2; }
[ C ] -> { start: north; } [ N ] { origin: C; offset: 0,-2; }
[ C ] -> { start: east; }  [ E ] { origin: C; offset: 2,0; }
[ C ] -> { start: west; }  [ W ] { origin: C; offset: -2,0; }
          +---+
          | N |
          +---+
            ^
            |
            |
+---+     +---+     +---+
| W | <-- | C | --> | E |
+---+     +---+     +---+
            |
            |
            v
          +---+
          | S |
          +---+
graph { flow: down; }

[ C ] -> { start: right; } [ R ] { origin: C; offset: 0,2; }
[ C ] -> { start: left; }  [ L ] { origin: C; offset: 0,-2; }
[ C ] -> { start: front; } [ F ] { origin: C; offset: 2,0; }
[ C ] -> { start: back; }  [ B ] { origin: C; offset: -2,0; }
          +---+
          | L | <+
          +---+  |
                 |
  +---------+    |
  v         |    |
+---+     +---+  |  +---+
| B |  +- | C | -+  | F |
+---+  |  +---+     +---+
       |    |         ^
       |    +---------+
       |
       |  +---+
       +> | R |
          +---+

可以看到第一个图根本没有什么变化;但是第二个图就完全不一样了,由于节点的偏移是固定的(不会随着整个图的方向变化而变化),因此所有的节点的位置不会发生改变,但是,从节点发出的边的方向发生了变化。

总结:如果希望图与方向无关,最嗨使用绝对的方向,比如东南西北;如果希望图可以旋转,那么就使用相对方向。

端口数目

通过设置一个边的起点和终点,可以指导布局器把边放置在那个端口上。

[ Left ] -> { start: left; end: left; } [ Right ]
  +------------+
  |            v
+------+     +-------+
| Left |     | Right |
+------+     +-------+