如何绘制凯莱图?

如何绘制凯莱图?

我需要绘制凯莱图,但我不知道该怎么做。具体来说,我需要与图中相同的图。请帮帮我。在此处输入图片描述

我现在可以这样做:

\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{lindenmayersystems}
\pgfdeclarelindenmayersystem{cayley}{
  \rule{F -> F [ R [F] [+F] [-F] ]}
  \symbol{R}{
    \pgflsystemstep=0.5\pgflsystemstep
  } 
}
\begin{document}
\begin{tikzpicture}
\draw l-system [l-system={cayley, axiom=[F] [+F] [-F] [++F], step=5cm, order=6}];
\end{tikzpicture}
\end{document}


\begin{document}
\begin{tikzpicture}
\draw l-system [l-system={cayley, axiom=[A] [+A] [-A] [++A], step=5cm, order=4}];
\end{tikzpicture}
\end{document}

答案1

这使用具有凯莱图维度的局部坐标系来注释它。然后有一些机制可以根据图中的位置打印群元素,这样就可以使用foreach循环。这种机制不一定适合高阶。

\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{lindenmayersystems,calc}
\pgfdeclarelindenmayersystem{cayley}{% https://tex.stackexchange.com/a/223078
  \rule{F -> F [ R [F] [+F] [-F] ]}
  \symbol{R}{
    \pgflsystemstep=0.5\pgflsystemstep
  } 
}
\newcommand\mysymb[1]{\pgfmathtruncatemacro{\itest}{Mod(#1,8)}%
\ifcase\itest
\sigma%
\or
\tau%
\or
\sigma^{-1}%
\or
\tau^{-1}%
\or
\sigma^2%
\or
\tau^2%
\or
\sigma^{-2}%
\or
\tau^{-2}%
\fi}
\begin{document}
\begin{tikzpicture}
 \draw l-system 
 [l-system={cayley, axiom=[F] [+F] [-F] [++F], step=5cm, order=6}];
 \begin{scope}[shift={(current bounding box.center)},
  x={($(current bounding box.east)-(current bounding box.center)$)},
  y={($(current bounding box.north)-(current bounding box.center)$)}] 
  \path[nodes={fill=white}] (0,0) node[scale=2]{$e$}
  foreach \X in {0,...,3} {(\X*90:1/2) node[scale={2/sqrt(2)}] {$\mysymb{\X}$}
   foreach \Y [evaluate=\Y as \Ymod using {int(Mod(\Y,4))}] in {\the\numexpr\X-1\relax,\X,\the\numexpr\X+1\relax}
   {($(\X*90:1/2)+(\Ymod*90:1/4)$)node[scale={2/sqrt(3)}] 
   {$\ifnum\X=\Ymod 
   \mysymb{\the\numexpr\X+4}
   \else
   \mysymb{\X}\mysymb{\Ymod}
   \fi$}}};
  \draw[thick] (45:{sqrt(2)/5}) -- (45:{sqrt(1/2)*1.2}) -- (0,1.2)
   -- (-1.2,0) -- (0,-1.2)  -- (-45:{sqrt(1/2)*1.2}) -- (-45:{sqrt(2)/5}) --
   cycle; 
  \draw[thick] (135:{sqrt(2)/5}) -- (135:{sqrt(1/2)*1.1})
   -- (-1.1,0) --  (-135:{sqrt(1/2)*1.1}) --
   (-135:{sqrt(2)/5}) -- cycle;  
 \end{scope} 
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案2

绘制此图的一个简单方法是使用 TikZ 递归执行!

例如这样:

\documentclass[tikz,border=5mm]{standalone}

\def\recdraw#1#2#3#4{
  %% #1 : Length of the current path
  %% #2 : Current position
  %% #3 : Current angle
  %% #4 : Number of recursion left
  \ifnum#4>0
  \begin{scope}[shift={(#2)}]
    \draw (0,0) -- (#3:#1);
    \recdrawB{.5*#1}{(#3:#1)}{#3}{\the\numexpr#4-1}
    \draw (0,0) -- (90+#3:#1);
    \recdrawB{.5*#1}{(#3+90:#1)}{\the\numexpr#3+90}{\the\numexpr#4-1}
    \draw (0,0) -- (-90+#3:#1);
    \recdrawB{.5*#1}{(#3-90:#1)}{\the\numexpr#3-90}{\the\numexpr#4-1}
  \end{scope}
  \fi
}

\def\recdrawB#1{
  \pgfmathsetmacro\foo{#1}\expandafter\recdraw\expandafter{\foo}
}


\begin{document}

\begin{tikzpicture}[scale=4]

  \foreach \r in {0,90,180,270}{
    \draw (0,0) -- (\r:1);
    \recdraw{.5}{\r:1}{\r}{7}
  }

\end{tikzpicture}

\end{document}

这使 凯莱图

请注意,它并不完美,使用 pic 肯定会更漂亮,但我还没有掌握 pics... :(

顺便说一句,\recdrawB这里使用该函数进行一些计算,因此我们不会保留“.5*.5*.5*...”(这可以加快处理速度)。但是找到一种方法来避免进行长度计算(可能使用图片或全局变量)肯定会快得多(但递归性会稍差一些)。

其余的绘制并不是很难,如果你需要的话我稍后会做(如果我有时间的话)!

相关内容