我在使用 TikZ 绘制图片时遇到了一些问题。我想要获得的图片如下所示:
。
这是我的代码:
\documentclass[10pt]{article}
\usepackage{pgf,tikz}
\usetikzlibrary{positioning,patterns}
\pagestyle{empty}
\begin{document}
\begin{tikzpicture}[scale=2]
\clip(0,0) rectangle (6,6);
\draw[thick] (3.,3.) circle ({pi/2});
\pgfmathsetmacro{\x}{1};
\draw[thick,pattern=north west lines, pattern color=black] (3.,3.) circle ({rad(atan(\x))});
\begin{scope}[shift={(3,3)}]
\foreach \z in {0.5,1,2,3}
\draw [variable=\y,domain=-\z+0.001:\z-0.001] plot ({deg(\y)+90}:{rad(atan( (\x*(1-(cosh(\x*\y)/cosh(\x*\z))^2)^(-0.5)))});
\end{scope}
\end{tikzpicture}
\end{document}
我得到的是
我有两个问题:
- 我的计算中有无穷大。这带来了各种问题,所以我限制了图中的域,这样就不会包含奇点(然后通过反正切函数将其映射到有限值)。但是,这样我无法得到正确的值,并且图不会触及外圆。
- 故事情节不太顺畅。
关于如何解决这个问题有什么想法吗?
答案1
编译需要一点时间,但看起来已经很接近了。我使用 pgfplots 来处理绘图和无穷大问题等。它已经提供了一个polaraxis
环境,因此无需做额外的工作。您还可以调用 gnuplot 指令来获得更高的精度。但我强烈建议更改颜色图。甚至 Matlab 也在 2014b 年停止使用它。
\documentclass{standalone}
\usepackage{pgfplots}
\usetikzlibrary{patterns,pgfplots.polar}
\begin{document}
\begin{tikzpicture}
\begin{polaraxis}[samples=200,grid=none,enlargelimits=false,
xtick=\empty,ytick=\empty,axis y line={none}]
\pgfmathsetmacro{\x}{1};
\pgfplotsinvokeforeach{0.15,0.3,...,3,pi}{
\addplot[mesh,domain=-#1+1e-3:#1-1e-3,variable=\y,
point meta=12-\plotnumofactualtype, % For color match
point meta max=30]
({deg(\y)+90},{rad(atan( (\x*(1-(cosh(\x*\y)/cosh(\x*#1))^2)^(-0.5)))});}
\end{polaraxis}
\end{tikzpicture}
\end{document}
答案2
这是一个作弊课程(你可以看到我的评论),而不是真正的解决方案。
\documentclass[varwidth,border=50]{standalone}
\usepackage{tikz}
\usetikzlibrary{positioning,patterns}
\begin{document}
\begin{tikzpicture}[scale=2]
\clip (3.,3.) circle ({pi/2 - .05});
\pgfmathsetmacro{\x}{1};
\draw[thick,pattern=north west lines, pattern color=black] (3.,3.) circle ({rad(atan(\x))});
\begin{scope}[shift={(3,3)}]
\foreach[evaluate=\z as \c using .3*\z] \z in {.1,.3,...,3,3.14} {
\definecolor{currentcolor}{hsb}{\c,1,1}
\draw [variable=\y,domain=-\z+0.001:\z-0.001, smooth, samples=100, currentcolor]
plot ({deg(\y)+90}:{rad(atan( (\x*(1-(cosh(\x*\y)/cosh(\x*\z))^2)^(-0.5)))});
}
\end{scope}
\draw[very thick] (3.,3.) circle ({pi/2 - .059});
\end{tikzpicture}
\end{document}
编辑:这是一个用于atan2
避免无穷问题的实际解决方案。
\documentclass[varwidth,border=50]{standalone}
\usepackage{tikz}
\usetikzlibrary{patterns}
\begin{document}
\begin{tikzpicture}[scale=2]
\draw[thick,pattern=north west lines, pattern color=black] circle (pi/4);
\foreach[
evaluate=\z as \c using \z/180,
evaluate=\z as \chz using cosh(rad(\z))]
\z in {10, 20, ..., 180} {
\definecolor{currentcolor}{hsb}{\c,1,1}
\draw [variable=\y,domain=-\z:\z, smooth, samples=100, currentcolor]
plot({\y + 90} : {rad(atan2(\chz, sqrt((\chz)^2 - (cosh(rad(\y)))^2)))});
}
\draw[very thick] circle (pi/2);
\end{tikzpicture}
\end{document}