TiKZ 坐标和节点的连接 - 简单明了一学就会

发布于 2022-01-28 08:29:24

这是一篇非常精炼讲解 TiKZ 坐标与节点互联的小文,有对这方面疑惑的用户,可以反复阅读演练一下,自然得其要旨,很快就可以得心应手了。Happy TiKZing!~

坐标坐标、节点坐标、节点节点的连结,基本上有三种:直线,曲线,直横(或横直)线。如

\coordinate [label=left:{$a$}](a) at (0,0);
\draw (a) circle (0.5);
\node[inner color=white, outer color=orange,inner sep=0.5cm] (b) at (5,2){$b$};
\draw (a)--(b);
\draw (a) controls (1,3) and (5,5)--(b);
\draw (a) -| (b);
\draw (a)|- (b);

可以看到坐标和节点的不同,连到结点的边缘时,线条就会停止。(a) -| (b),指从a 出发,延水平线走到b的垂直投影位罝,再走垂直线到b。而 (a) |- (b),是a 出发,往垂直方向走到b的水平投影位置,再走水平线到b。

f_12111823_1.png

这些连线可以加上箭头的控制指令,变成不同的效果:

f_12111784_1.png

如果想要有不同的箭头,可以使用arrows.meta library,在里面定义了许多不同的箭头。

线的连法也可以使用to指令如:

\cooridnate [label=left:a](a) at (0,0);
\node[draw,circle,label=right:b] (b) at (6,4);
(a)to(b),(a)到(b)的直線;
(a)to [out=90, in=90]b,(a)到(b)的曲線,出發方向90度,進入b方向90度。
(a) to [bend right=60]b,(a)到(b)的曲線,出發方向是(a)(b)線段右方60度,進入方向是(a)(b)線段右方60度。

f_12111785_1.png

另外还有一个指令edge,用法和to很像:

\path ... edge (node or coordinate)...; 
其本身的意义就是一个路径。

用法也差不多:如果(a)(b)(c)(d)已经有了坐标或结点的定义,

\path (a) edge (b)
(b) edge[->,red] (c)
(c) edge [-,dotted,black](d)
(d) edge [<-,bend left=""30,blue](a);

就能画出不同种类的连结线,这些线段也可以进行标识,主要是使用node指令(如果前面定义了every node/.style,就会受到影响,要注意)一条线段的标识,主要是位置,上下,倾斜等等参数的控制,使用直线和曲线都是一样的。如:

\draw (0,0)--(5,3);

如这这条线要做标示,可以这样:

\draw (0,0)--node{a}(5,3);

这样会在线段中间的地方会有字母a画在上面。如果想要在不同的位置,一些参数可以控制:at start, very near start, near start, midway, near end, very near end, at end,等等位位置的参数,可以控制:

f_12111787_1.png

\draw (0,0)-- node[near start]{b} node[midway]{a} (5,3);

另外,也可以pos参数来控制位置,pos 的参数值是0到1之间的数值,表示该线段的比例处:

\draw (0,0)-- node[pos=0.2]{a} (5,3);
\draw (2,0) to[bend left=30] (5,2);

确定了位罝后,还可以决定在该位置的哪一边,用上(above)下(below)左(left)右(right)来控制:

-- node [pos=0.2, left] .. 在0.2位置的右方。

如果全部都在固定在某一方,如左方,可以用[auto=left],使每个标示都在左方。

如果同一个位罝可需要不同的标示,可以用swep 或其缩写指令"'"。在在该处(左右)一方有标示时,会自动转换到另一边标示。

sloped会让文字旋转,配合线段该处的斜率。

接下来就用实例来画出二整数辗转相除法求最大公因子的程序演算流程图,这个图定义了三程不同的node:

io: 是表示输出输入的node,用梯形。

op: 是表示演算过程的node,用方形。

cn: 是表示判断过程的node,用菱形。

要使用梯形和菱形,要使用geometric library。设定好后,要使用梯型的node,就用nodeio{};即可:

\begin{tikzpicture}[
io/.style={trapezium, trapezium left angle=70, trapezium right angle=110, fill=magenta!10, draw=magenta}
op/.style={rectangle, fill=orange!10, draw=orange},
cn/.style={diamond, aspect=2, inner sep=2pt, fill=red!10, draw=red},
node distance=5mm, thick]
\node[io] (in) {求$a,b$之最大公因數};
\node[op, below=of in] (div) {$r=a \mod b$};
\node[op, below=of div] (set) {$a=b, \ b=r$};
\node[cn, below=of set] (cond) {$b=0?$};
\node[io, below=of cond] (out) {$a$值是解答};
\path[->]
(in) edge (div)
(div) edge (set)
(set) edge (cond)
(cond) edge node[right]{Yes} (out);
\draw (cond)--node[below]{No} ++(1.5,0) |- (div);
\end{tikzpicture}

f_12092072_1.png

选自:http://blog.udn.com/paraquat/22113130

0 条评论

发布
问题