我想在我读过的一篇论文的介绍中添加下图。我读过一篇关于 tikz 的简介,但这个图对我来说仍然很复杂。有人能帮忙或给我一些指南来帮助我吗?
答案1
好的,让我们来解决它。
我使用这个through
库是因为我们可以简单地使用节点的锚点作为参考,而不必担心圆圈在我们的图片中的确切位置。
样式
我定义了三种风格:
- 该
dot node
样式适用于圆圈上的简单节点,我已使用该样式,fill=white
以便在圆圈中看不到圆圈。这在简单背景下效果最佳。 - 继承
dotdot node
了dot node
样式,但也在里面放置了一个填充点(伪装成标签)。 - 这
arc style
是圆圈中的弧形箭头,需要缩短量,以便|
箭头的部分重叠以连接箭头。有关该问题的更多讨论和其他解决方案,请参阅TikZ 箭头尖端发生位移
样式dotdot node
需要两个强制参数。一个用于命名节点,第二个用于标签的任何选项。我们稍后会使用它在标签(节点中的黑点)上放置一个图钉。
TikZ 图片选项
选项包括tikzpicture
:
thick
,every ping edge/.style={<-}
设置引脚的箭头样式。如果您在代码中使用其他引脚,则需要更改此设置并声明用于引脚边缘的单独样式。>=latex
设置箭头的默认箭头>
。我不太喜欢这种to
风格,所以我在这里设置latex
。
下面declare function
用于声明一些常量(圆和箭头弧的外半径和内半径)和一个angleofNode
接受参数(节点号)的函数。由于我们放置了 23 个节点,因此此函数可以轻松计算圆上的角度。
我们也可以使用 LaTeX 宏,例如
\newcommand*{\outerR}{4}
\newcommand*{\innerR}{3.3}
\newcommand*{\angleofNode}[1]{(#1)/23*360}
并且可以使用这些宏代替 PGF 数学函数。
绘画
外圆很简单。使用库circle through
中的键可以轻松绘制圆。我们为下一步的节点through
命名。c
c.east
现在可以通过、c.30
、等访问圆上的点。c.170
我们用它将简单的dot node
s 放在那里。\foreach
循环可用于绘制一组节点。
另一个\foreach
循环用于绘制dotdot node
s。在同一步骤中,我们还绘制标签A_{<something>}
、命名dotdot node
sdd-<number>
以及dotdot node
s 内的黑点。这些被命名为ddd-<number>
,这是通过样式的第一个参数完成的dotdot node
。第二个参数用于为pin
和文本T_{<something>}
。
在所有情况下,我们都使用第二个值对循环中的每个步骤声明了<something>
宏\tLabel
。标签和引脚的方向也在循环中定义。\foreach
的循环非常强大,有自己的标签foreach。简短介绍可参见Tikz 中 foreach 循环的结构、元组或字典。
第三个也是最后一个\foreach
循环用于绘制圆弧。现在,这并不容易,因为我们没有圆可以参考。即使有,我们也必须自己绘制圆弧。
路径arc
操作符不会以指定的半径从一个点到另一个点绘制圆弧。它会以指定的半径、特定的起点和特定的终点角度从路径上的最后一点绘制圆弧。(delta angle
当您只有其中一个角度时,也有此操作符。)
因此,我们需要移动到圆弧上的一个点:({angleofNode(\sAngle)}:innerR)
。然后我们绘制一个arc
半径为的圆弧,innerR
从节点\sAngle
到\eAngle
。同样,该angleofNode(<node number>)
函数帮助我们找到正确的角度。不幸的是,沿arc
s 放置节点的功能不起作用(无论如何在当前发布的 TikZ 版本中),所以我还手动将节点放置在路径的中间,但.3cm
靠近中心。这在之前已经讨论过了如何将节点放置在圆弧的中间?。
代码
\documentclass[tikz,convert=false]{standalone}
\usetikzlibrary{through,arrows}
\tikzset{
dot node/.style={
shape=circle,
fill=white,
draw,
inner sep=+0pt,
minimum size=+5mm
},
dotdot node/.style 2 args={
dot node,
label={[shape=circle,fill=black,outer sep=+0pt,inner sep=+0pt,minimum size=+3mm,name=ddd-#1,#2]center:}
},
arc style/.style={
|<->|,
shorten >=+-.5\pgflinewidth,
shorten <=+-.5\pgflinewidth,
}
}
\begin{document}
\begin{tikzpicture}[
thick,
every pin edge/.style={<-},
>=latex,
declare function/.list={
outerR=4;,
innerR=3.3;,
angleofNode(\a)=\a/23*360;}
]
\node [draw,circle through=(0:outerR)] (c) {};
\foreach \iAngle in {1,2,4,5,7,8,10,11,...,14,16,17,19,20,...,22}
\node[dot node] at (c.{angleofNode(\iAngle)}) {};
\foreach \iAngle/\tLabel/\lDir/\pDir in {0/3/above right/-10,%
3/2/above right/right,%
6/1/above/30,%
9/k/above left/above,%
15/l+1/below/left,%
18/l/below right/below}
\node[
dotdot node=\iAngle{pin={\pDir:{$T_{\tLabel}$}}},
label=\lDir:$A_{\tLabel}$
] (dd-\iAngle) at (c.{angleofNode(\iAngle)}) {};
\foreach \sAngle/\eAngle/\tLabel in {0/3/2,%
3/6/1,%
6/9/k,%
15/18/l}
\draw[arc style] ({angleofNode(\sAngle)}:innerR) arc[radius=innerR, start angle=angleofNode(\sAngle), end angle=angleofNode(\eAngle)]
node at ({angleofNode(\sAngle+\eAngle)/2}:innerR-.3) {$S_{\tLabel}$} ;
\end{tikzpicture}
\end{document}
输出
答案2
使用 PSTricks。
\documentclass[pstricks]{standalone}
\usepackage{pst-node,pst-plot}
\psset{saveNodeCoors}
\newcommand\MAL[4][1.5]{% Middle Arc Label
\rput(!#1 N-#3.y N-#3.x atan N-#2.y N-#2.x atan add 2 div PtoC){$#4$}}
\newcommand\NL[6][]{% Node Label
\qdisk(#2){3pt}
\uput{12pt}[#4](#2){$#3$}
\ifx\\#1\\%
\def\name{#5}
\else
\def\name{#1}
\fi
\uput{17pt}[#6](#2){\rnode{\name}{$#5$}}
\pcline[nodesepB=3pt,nodesepA=7pt]{->}(\name)(#2)}
\everypsbox{\scriptsize}
\begin{document}
\begin{pspicture}(-4,-4)(6,4)
% Big circle
\pscircle{2.5}
% Node declaration
\curvepnodes[plotpoints=24]{0}{360}{2.5 t PtoC}{P}
% Small circles
\multido{\i=0+1}{\Pnodecount}{\pscircle[fillstyle=solid](P\i){5pt}}
% Arcs
\begingroup
\psset{arrows=|<*->|*}
\psarc(0,0){2}{(P0)}{(P3)}
\psarc(0,0){2}{(P3)}{(P6)}
\psarc(0,0){2}{(P6)}{(P9)}
\psarc(0,0){2}{(P15)}{(P18)}
\endgroup
% Middle Arc Labels
\MAL{P0}{P3}{S_2}
\MAL{P3}{P6}{S_1}
\MAL{P6}{P9}{S_k}
\MAL{P15}{P18}{S_l}
% Node Labels
\NL{P0}{A_3}{15}{T_3}{-15}
\NL{P3}{A_2}{45}{T_2}{0}
\NL{P6}{A_1}{90}{T_1}{45}
\NL{P9}{A_k}{135}{T_k}{90}
\NL[TL1]{P15}{A_{l+1}}{-90}{T_{l+1}}{180}
\NL{P18}{A_l}{-45}{T_l}{-90}
% Others
\psarcn{->}{3.75}{35}{-20}
\uput{4}[7.5](0,0){\parbox{2cm}{\scriptsize Traverse\\Direction}}
\end{pspicture}
\end{document}