Tikz 绘制带节点的环

Tikz 绘制带节点的环

我想在我读过的一篇论文的介绍中添加下图。我读过一篇关于 tikz 的简介,但这个图对我来说仍然很复杂。有人能帮忙或给我一些指南来帮助我吗?

环图

答案1

好的,让我们来解决它。

我使用这个through库是因为我们可以简单地使用节点的锚点作为参考,而不必担心圆圈在我们的图片中的确切位置。

样式

我定义了三种风格:

  • dot node样式适用于圆圈上的简单节点,我已使用该样式,fill=white以便在圆圈中看不到圆圈。这在简单背景下效果最佳。
  • 继承dotdot nodedot 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 nodes 放在那里。\foreach循环可用于绘制一组节点。

另一个\foreach循环用于绘制dotdot nodes。在同一步骤中,我们还绘制标签A_{<something>}、命名dotdot nodesdd-<number>以及dotdot nodes 内的黑点。这些被命名为ddd-<number>,这是通过样式的第一个参数完成的dotdot node。第二个参数用于为pin和文本T_{<something>}

在所有情况下,我们都使用第二个值对循环中的每个步骤声明了<something>\tLabel。标签和引脚的方向也在循环中定义。\foreach的循环非常强大,有自己的标签。简短介绍可参见Tikz 中 foreach 循环的结构、元组或字典

第三个也是最后一个\foreach循环用于绘制圆弧。现在,这并不容易,因为我们没有圆可以参考。即使有,我们也必须自己绘制圆弧。

路径arc操作符不会以指定的半径从一个点到另一个点绘制圆弧。它会以指定的半径、特定的起点和特定的终点角度从路径上的最后一点绘制圆弧。(delta angle当您只有其中一个角度时,也有此操作符。)

因此,我们需要移动到圆弧上的一个点:({angleofNode(\sAngle)}:innerR)。然后我们绘制一个arc半径为的圆弧,innerR从节点\sAngle\eAngle。同样,该angleofNode(<node number>)函数帮助我们找到正确的角度。不幸的是,沿arcs 放置节点的功能不起作用(无论如何在当前发布的 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}

在此处输入图片描述

相关内容