desenhando sinusóides programaticamente com tikz

desenhando sinusóides programaticamente com tikz

Aqui estão oito oscilações completas de uma onda senoidal:

Seno

Aqui está o código:

\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}

Minha pergunta não é necessariamente sobre ondas senoidais ou funções trigonométricas. É mais sobre escrever algoritmos com LaTeX e usá-lo como uma linguagem de programação real.

Observe como especifiquei manualmente 32 pares de coordenadas e me referi a ambos sine cos16 vezes apenas para desenhar 8 iterações da mesma curva? Digamos que eu queira gerar uma série de ondas autônomas diferentes que sejam semelhantes, mas diferentes desta. Não quero ter que digitar todas as coordenadas todas as vezes, quero automatizar todas as coisas chatas e repetitivas.

Agora, não preciso que alguém apenas desenhe para mim e despeje o código, mas sim compartilhe e explique os diferentes truques e técnicas que você pode usar para resolvê-lo de forma programática. Muitos de nós não temos conhecimento das ferramentas à nossa disposição. O objetivo é mostrar ao resto de nós como abordar e resolver esses problemas por conta própria, para que possamos aprender a fazer isso por nós mesmos.

Responder1

Para desenhar sua função sinusal eu usaria plotmacro:

\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}

Editar:

  • TikZ fornece macro plotpara desenho de função. Seu uso é descrito na seção22.5 Traçando uma Função, pp 339 no Manual TikZ & PGF (versão 3.1.4a).

  • Como defino o domínio em radianos, ao argumento da sinfunção é adicionado r: sin(\x r), que faz a conversão do argumento da função de radianos para graus.

  • na definição de domínio é usado um pequeno truque. Como o domínio de oito intervalos de função é maior que a largura do texto, o domínio é reduzido para metade (para 16*pi`` and the same time the widths of intervals is shortened to0,5*\x` (isto é o dobro da frequência da função):

\draw[blue] plot[domain=0:16*pi, samples=320] (0.5*\x,{2*sin(\x r)});
  • Essa função desenhada é suave, usei 20 amostras por radiano (todas juntas 320 amostras)

insira a descrição da imagem aqui

Responder2

Fornecendo frequência, período e amplitude da onda senoidal com cores como opções no picconjunto. A grade é desenhada de acordo com os valores de frequência, período e amplitude. foreacho loop in tikzseté iniciado com zero e a frequência é desenhada com 0 to f-1. Desenhar a sinusóide é baseado em TiKz fundamentos.

\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}

Para f=8e :p=4a=2\pic {sw={color=blue,f=8,p=4,a=2}};

insira a descrição da imagem aqui

Para f=4e :p=5a=3\pic {sw={color=red,f=4,p=5,a=3}};

insira a descrição da imagem aqui

TERMO ADITIVO: Adicionando alguns recursos ao código:

\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}

insira a descrição da imagem aqui

Responder3

Um ponto de partida muito rudimentar com foreachloops. Não é elegante (IMO), mas oferece uma possibilidade.

\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}

No entanto, tenho certeza de que você pode fazer muito mais do que isso :)

insira a descrição da imagem aqui

informação relacionada