我需要绘制凯莱图,但我不知道该怎么做。具体来说,我需要与图中相同的图。请帮帮我。
我现在可以这样做:
\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*...”(这可以加快处理速度)。但是找到一种方法来避免进行长度计算(可能使用图片或全局变量)肯定会快得多(但递归性会稍差一些)。
其余的绘制并不是很难,如果你需要的话我稍后会做(如果我有时间的话)!