處理無窮大的 TikZ 圖

處理無窮大的 TikZ 圖

我在使用 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}

我得到的是

在此輸入影像描述

我有兩個問題:

  • 我的計算中有無窮大。這會帶來各種各樣的問題,因此我限制了圖中的域,以便不包含奇異點(然後透過 arctan 函數將其對應到有限值)。但是,透過這種方式,我無法獲得正確的值,並且繪圖不會接觸外圓。
  • 劇情線並不流暢。

關於如何解決這個問題有什麼想法嗎?

答案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}

在此輸入影像描述

相關內容