![desenhando sinusóides programaticamente com tikz](https://rvso.com/image/399839/desenhando%20sinus%C3%B3ides%20programaticamente%20com%20tikz.png)
Aqui estão oito oscilações completas de uma onda senoidal:
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 sin
e cos
16 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 plot
macro:
\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
plot
para 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
sin
função é adicionador
: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 to
0,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)
Responder2
Fornecendo frequência, período e amplitude da onda senoidal com cores como opções no pic
conjunto. A grade é desenhada de acordo com os valores de frequência, período e amplitude. foreach
o 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=8
e :p=4
a=2
\pic {sw={color=blue,f=8,p=4,a=2}};
Para f=4
e :p=5
a=3
\pic {sw={color=red,f=4,p=5,a=3}};
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}
Responder3
Um ponto de partida muito rudimentar com foreach
loops. 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 :)