如何在 tikz 中绘制非常微小的循环?

如何在 tikz 中绘制非常微小的循环?

在此处输入图片描述我正在尝试以没有边交叉的方式绘制 Brujin 图 D(2,3),但 {0}{11}{22} 上的环路给我带来了麻烦。有没有办法用这种格式让环路变得非常小?此致。

    \documentclass{article}
    \usepackage{tikz}
    \usepackage{tkz-graph}

    \begin{document}
    \begin{figure}
    \begin{tikzpicture}
      \SetGraphUnit{4}
      \GraphInit[vstyle=Normal]


                          
      \Vertices{circle}{00,01,11,12,22,20}
      \Edges[style = ->](00,01,11,12,22,20,00)
      \SetGraphUnit{1.5}
      \Vertices{circle}{10,21,02}
      \Edges[style = ->](10,02,21,10)
      \tikzset{EdgeStyle/.style= {->, bend left}}
      \Edges[style = ->](01,10,01)
      \Edges[style = ->](02,20,02)
      \Edges[style = ->](21,12,21)
      \tikzset{EdgeStyle/.style= {->, bend right = 100}}
      
      \Edges[style = ->](12,20,01,12)
      \tikzset{EdgeStyle/.style= {->}}
      \Edges[style = ->](21,11,10)
      \Edges[style = ->](02,22,21)
      \Edges[style = ->](10,00,02)
      \Loop[style = {->}, dir = NO](00)
      \Loop[style = {->}](11)
      \Loop[style = {->}](22)
    
    \end{tikzpicture} 
    \caption{De Brujin}
    \end{figure}
    \end{document}

答案1

loop始终加载的默认topaths图书馆在我看来,有相对较小的环,看起来很漂亮。

我已将其扩展为允许使用右上方、左上方、左下方和右下方四个缺失的罗盘方向。以及Loop将方向作为角度的通用键(loop right将是loop = 0)。

为了放置节点,我使用了库,它提供了语法以及。graphs(.standard)graphsubgraph C_n

节点的连接也是通过graphs语法完成的。

对于 01、20 和 12 之间的大箭头,我将 设置looseness为 2,将相对角度设置为50。这样可以形成更锐利的曲线,使其恰好适合中间的节点。

bbox图书馆用于这些大曲线,以便正确评估边界框并且图片不会大于它需要的。

在这种情况下,这些循环本身已经足够小了,但我在可以放置这些循环的位置添加了虚线重复项。

代码

\documentclass[tikz]{standalone}
\usetikzlibrary{graphs.standard, arrows.meta, bending, bbox}
\tikzset{
  Loop/.style={anchor={#1+180}, out={#1+15}, in={#1-15}, loop},
  /utils/temp/.style args={#1:#2:#3}{loop #1/.style={#1,out={#2},in={#3},loop}},
  /utils/temp/.list={above right:60:30, above left:150:120,
                     below left:240:210, below right:300:270},
  every new ->/.append style={shorten >=+3\pgflinewidth},
  every new <-/.append style={shorten <=+3\pgflinewidth}}
\begin{document}
\tikz[> = {Stealth[round]}]
  \graph[
    nodes = {draw, circle},
    clockwise, phase = 0, radius = 1.5cm,
    chain polar shift=(0:2cm)
  ]{% -!- makes it so that the second subgraph is considered a chain
    subgraph C_n[->, V={10, 02, 21}] -!-
    subgraph C_n[<-, V={00, 20, 22, 12, 11, 01}],
    {[cycle, ->] 02, 22, 21, 11, 10, 00},
    {[/tikz/bend left=15, ->, every group/.append style=cycle]
      {10, 01}, {02, 20}, {12, 21}
    },
    00 ->[loop right     ] 00,
    11 ->[loop above left] 11,
    22 ->[loop below left] 22,
    {[edge=dashed] % as an option
      00 ->[Loop = 150] 00,
      11 ->[loop below] 11,
      22 ->[Loop = 30 ] 22
    },
    {[/tikz/bend right=50, /tikz/looseness=2, /pgf/bezier bounding  box, ->, cycle]
      01, 12, 20
    }
  };
\end{document}

输出

在此处输入图片描述

相关内容