tikz を使ってプログラム的に正弦波を描く

tikz を使ってプログラム的に正弦波を描く

ここに正弦波の完全な 8 つの振動を示します。

正弦

コードは次のとおりです:

\documentclass{standalone}
\usepackage{tikz}

\begin{document}

    \begin{tikzpicture}
        \draw[gray!20] (0,-2) grid (32,2); %Grid
        \draw[black,-] (0, 0)  --  (32,0); %X-Axis
        \draw[black,-] (0,-2)  --  (0 ,2); %Y-Axis
        \draw[blue]    (0 ,0)              %Origin
        %Sine-Wave%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
            sin (1 ,2) cos (2 ,0) sin (3 ,-2) cos (4 ,0) sin (5 ,2) cos (6 ,0) sin (7 ,-2) cos (8 ,0)
            sin (9 ,2) cos (10,0) sin (11,-2) cos (12,0) sin (13,2) cos (14,0) sin (15,-2) cos (16,0) 
            sin (17,2) cos (18,0) sin (19,-2) cos (20,0) sin (21,2) cos (22,0) sin (23,-2) cos (24,0) 
            sin (25,2) cos (26,0) sin (27,-2) cos (28,0) sin (29,2) cos (30,0) sin (31,-2) cos (32,0);
        \end{tikzpicture}

\end{document}

私の質問は必ずしも正弦波や三角関数に関するものではありません。むしろ、LaTeX でアルゴリズムを記述し、それを実際のプログラミング言語のように使用することに関するものです。

同じ曲線を 8 回繰り返して描画するためだけに、32 組の座標を手動で指定し、両方をsin16cos回参照しているのに気付きましたか? たとえば、これに似ているが異なる一連の独立した波を生成したいとします。毎回すべての座標を入力したくないので、退屈で反復的な作業をすべて自動化したいのです。

今、私が必要としているのは、ただ単にそれを描いてコードをダンプしてくれる人ではなく、プログラム的にそれを解決するために使用できるさまざまなトリックやテクニックを共有し、説明してくれる人です。私たちの多くは、利用できるツールに気づいていません。目標は、私たち全員がこれらの問題に自分でアプローチして解決する方法を示し、自分でそれを学べるようにすることです。

答え1

正弦関数を描画するには、plot次のマクロを使用します。

\documentclass[tikz, margin=3mm]{standalone}

\begin{document}
    \begin{tikzpicture}
\draw[gray,thin] (0,-2) grid[xstep=pi/2,ystep=1] (8*pi,2); %Grid
\draw   (0, 0)  --  (8*pi,0)  %X-Axis
        (0,-2)  --  (0 ,2);   %Y-Axis
% Sine-Wave, \x r means to convert '\x' from degrees to radians
\draw[blue] plot[domain=0:16*pi, samples=320] (0.5*\x,{2*sin(\x r)});
    \end{tikzpicture}
\end{document}

編集:

  • TikZは関数を描画するためのマクロを提供しますplot。その使用法については、セクション22.5 関数のプロット、TikZ & PGF マニュアル (バージョン 3.1.4a) の 339 ページ。

  • ドメインをラジアンで定義しているので、関数の引数に: をsin追加し、関数の引数をラジアンから度に変換します。rsin(\x r)

  • ドメインを定義する際に、ちょっとしたトリックが使われます。8つの関数間隔のドメインはテキストの幅よりも長いため、ドメインは半分(16*pi`` and the same time the widths of intervals is shortened to0.5*\x`)に短縮されます(これにより関数の頻度が2倍になります)。

\draw[blue] plot[domain=0:16*pi, samples=320] (0.5*\x,{2*sin(\x r)});
  • 描画された関数は滑らかで、ラジアンあたり20サンプルを使用しました(合計320サンプル)。

ここに画像の説明を入力してください

答え2

正弦波の周波数、周期、振幅を色付きでpic設定します。グリッドは周波数、周期、振幅の値に従って描画されます。foreachループはtikzsetゼロから始まり、周波数は で描画されます0 to f-1。正弦波の描画は Ti に基づいています。z の基礎。

\documentclass[tikz,border=10pt]{standalone}
\tikzset{%
pics/sw/.style args={color=#1,f=#2,p=#3,a=#4}{%
code={%
    \def\f{#2}%Frequency
    \def\p{#3}%Period
    \def\a{#4}%Amplitude
\draw[gray!20] (0,-\a) grid (\p*\f,\a); %Grid
    \draw[black,-] (0, 0)  --  (\p*\f,0); %X-Axis
    \draw[black,-] (0,-\a)  --  (0 ,\a); %Y-Axis
    \pgfmathsetmacro{\k}{#2-1}
\foreach \t in{0,1,...,\k}{
\draw[thick,#1] ({\t*\p},0) sin (#3/4+\t*\p,#4)cos(#3/2+\t*\p,0)sin(#3*3/4+\t*\p,-#4)cos(#3+\t*\p,0);%
}%
}
 }
 }  
   \begin{document}
    \begin{tikzpicture}
\pic {sw={color=blue,f=8,p=4,a=2}};
    \end{tikzpicture}

\end{document}

f=8、およびp=4の場合a=2:\pic {sw={color=blue,f=8,p=4,a=2}};

ここに画像の説明を入力してください

f=4、およびp=5の場合a=3:\pic {sw={color=red,f=4,p=5,a=3}};

ここに画像の説明を入力してください

補遺: コードにいくつかの機能を追加します。

\documentclass[tikz,border=10pt]{standalone}
\tikzset{%
pics/sw/.style args={color=#1,f=#2,p=#3,a=#4}{%
code={%
    \def\f{#2}%Frequency
    \def\p{#3}%Period
    \def\a{#4}%Amplitude
\draw[gray!50] (0,-\a) grid (\p*\f,\a); %Grid
    \pgfmathsetmacro{\n}{#2*#3}
\foreach \x in{0,1,...,\n}{
\node at (\x,0)[below right]{\x};}
    \draw[black,->] (0, 0)  --  (\p*\f+1,0)node[above]{$x$}; %X-Axis
    \draw[black,->] (0,-\a)node[left]{-$#4$}  --  (0 ,\a+1)node[right]{$y$}; %Y-Axis
    \node at (0,\a)[left]{$#4$};
    \pgfmathsetmacro{\k}{#2-1}
\foreach \t in{0,1,...,\k}{
\draw[ultra thick,#1] ({\t*\p},0) sin (#3/4+\t*\p,#4)cos(#3/2+\t*\p,0)sin(#3*3/4+\t*\p,-#4)cos(#3+\t*\p,0);%
}%
\node at (\n/2,\a+1){$y=\sin\,x$};%
}
 }
 }  
   \begin{document}
    \begin{tikzpicture}
\pic {sw={color=cyan,f=6,p=4,a=3}};
    \end{tikzpicture}

\end{document}

ここに画像の説明を入力してください

答え3

ループを使った非常に粗雑な出発点foreach。エレガントではない (IMO) が、可能性の 1 つを示します。

\documentclass{standalone}
\usepackage{tikz}

\begin{document}
    \begin{tikzpicture}
    \draw[gray!20] (0,-2) grid (32,2); %Grid
    \draw[black,-] (0, 0)  --  (32,0); %X-Axis
    \draw[black,-] (0,-2)  --  (0 ,2); %Y-Axis
    %% incorporating @marmot's (user121799) suggestion      
    \draw[blue] foreach \x in {1,5,...,29} { ({\x-1} ,0) sin ({\x} ,2) cos ({\x+1} ,0) sin ({\x+2}, -2) cos ({\x+3} ,0)};
    \end{tikzpicture}
\end{document}

それでも、これよりはるかに多くのことができると確信しています :)

ここに画像の説明を入力してください

関連情報