首先,如果这个问题之前已经问过,我要道歉。我试图描绘出一个基本领域的行动图景。模块化(即$PSL_2(\mathbb{Z})$
)在庞加莱双曲平面上作用TikZ
,我想知道是否有一种简单的方法可以做到这一点。特别是,我想重新创建本文第 33 页上的图像:http://www.math.ou.edu/~kmartin/mfs/ch3.pdf,或者参见维基百科中的这张图片:
任何帮助都将受到赞赏。
答案1
我不知道如何计算每次迭代的半径或如何确定 x 步数,但原则上你可以做这样的事情:
代码
\documentclass[tikz,border=3mm]{standalone}
\usetikzlibrary{arrows}
\begin{document}
\pgfmathsetmacro{\myxlow}{-2}
\pgfmathsetmacro{\myxhigh}{2}
\pgfmathsetmacro{\myiterations}{6}
\begin{tikzpicture}[scale=2]
\draw[-latex](\myxlow-0.1,0) -- (\myxhigh+0.2,0);
\pgfmathsetmacro{\succofmyxlow}{\myxlow+0.5}
\foreach \x in {\myxlow,\succofmyxlow,...,\myxhigh}
{ \draw (\x,0) -- (\x,-0.05) node[below,font=\tiny] {\x};
}
\foreach \y in {0.2,0.4,...,1}
{ \draw (0,\y) -- (-0.05,\y) node[left,font=\tiny] {\pgfmathprintnumber{\y}};
}
\draw[-latex](0,-0.1) -- (0,1.2);
\clip (\myxlow,0) rectangle (\myxhigh,1.1);
\foreach \i in {1,...,\myiterations}
{ \pgfmathsetmacro{\mysecondelement}{\myxlow+1/pow(2,floor(\i/3))}
\pgfmathsetmacro{\myradius}{pow(1/3,\i-1}
\foreach \x in {-2,\mysecondelement,...,2}
{ \draw[very thin, blue] (\x,0) arc(0:180:\myradius);
\draw[very thin, blue] (\x,0) arc(180:0:\myradius);
}
}
\end{tikzpicture}
\end{document}
输出
编辑1:为了随后填充区域,我将 放在clip
一个范围内以保持效果的局部性。如果您clip
多次使用,则使用所有值的交集,因此我按以下方式进行操作:首先,我剪切一个从 -0.5 到 0.5 的矩形区域,然后剪切中间圆弧的“外部”,从而得到您要查找的区域。提示:您可以将 s 替换clip
为 ,\fill[opacity=0.5]
以直观地了解剪切区域的构造方式。
输出,无图层
如您所见,事后填充的缺点是它会覆盖现有线条。这可以通过使用图层来解决。首先在主图层中绘制所有内容,然后填充背景图层:
代码
\documentclass[tikz,border=3mm]{standalone}
\usetikzlibrary{arrows}
\pgfdeclarelayer{background}
\pgfsetlayers{background,main}
\begin{document}
\pgfmathsetmacro{\myxlow}{-2}
\pgfmathsetmacro{\myxhigh}{2}
\pgfmathsetmacro{\myiterations}{6}
\begin{tikzpicture}[scale=2]
\draw[-latex](\myxlow-0.1,0) -- (\myxhigh+0.2,0);
\pgfmathsetmacro{\succofmyxlow}{\myxlow+0.5}
\foreach \x in {\myxlow,\succofmyxlow,...,\myxhigh}
{ \draw (\x,0) -- (\x,-0.05) node[below,font=\tiny] {\x};
}
\foreach \y in {0.2,0.4,...,1.4}
{ \draw (0,\y) -- (-0.05,\y) node[left,font=\tiny] {\pgfmathprintnumber{\y}};
}
\draw[-latex](0,-0.1) -- (0,1.6);
\begin{scope}
\clip (\myxlow,0) rectangle (\myxhigh,1.1);
\foreach \i in {1,...,\myiterations}
{ \pgfmathsetmacro{\mysecondelement}{\myxlow+1/pow(2,floor(\i/3))}
\pgfmathsetmacro{\myradius}{pow(1/3,\i-1}
\foreach \x in {-2,\mysecondelement,...,2}
{ \draw[very thin, blue] (\x,0) arc(0:180:\myradius);
\draw[very thin, blue] (\x,0) arc(180:0:\myradius);
}
}
\end{scope}
\begin{scope}
\begin{pgfonlayer}{background}
\clip (-0.5,0) rectangle (0.5,1.7);
\clip (1,1.7) -| (-1,0) arc (180:0:1) -- cycle;
\fill[gray,opacity=0.8] (-1,-1) rectangle (1,2);
\end{pgfonlayer}
\end{scope}
\end{tikzpicture}
\end{document}