programmgesteuertes Zeichnen von Sinuskurven mit Tikz

programmgesteuertes Zeichnen von Sinuskurven mit Tikz

Hier sind acht vollständige Schwingungen einer Sinuswelle:

Sinus

Hier ist der Code:

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

Meine Frage bezieht sich nicht unbedingt auf Sinuswellen oder trigonometrische Funktionen. Es geht eher darum, Algorithmen mit LaTeX zu schreiben und es wie eine echte Programmiersprache zu verwenden.

Beachten Sie, dass ich 32 Koordinatenpaare manuell angegeben und 16 Mal auf beide verwiesen habe, sinnur cosum 8 Iterationen derselben Kurve zu zeichnen? Angenommen, ich möchte eine Reihe unterschiedlicher eigenständiger Wellen generieren, die dieser ähnlich, aber dennoch unterschiedlich sind. Ich möchte nicht jedes Mal jede einzelne Koordinate eingeben müssen, sondern all die langweiligen, sich wiederholenden Dinge automatisieren.

Jetzt brauche ich niemanden, der es einfach für mich zeichnet und den Code ausgibt, sondern jemanden, der die verschiedenen Tricks und Techniken teilt und erklärt, mit denen Sie es programmgesteuert lösen können. Viele von uns sind sich der uns zur Verfügung stehenden Tools nicht bewusst. Das Ziel besteht darin, dem Rest von uns zu zeigen, wie wir diese Probleme selbst angehen und lösen können, damit wir lernen können, es selbst zu tun.

Antwort1

Zum Zeichnen Ihrer Sinusfunktion würde ich plotdas Makro verwenden:

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

Bearbeiten:

  • TikZ stellt ein Makro plotzum Zeichnen von Funktionen zur Verfügung. Seine Verwendung wird im Abschnitt22.5 Eine Funktion grafisch darstellen, S. 339 im TikZ- und PGF-Handbuch (Version 3.1.4a).

  • Da ich die Definitionsmenge in Radiant definiere, wird zum Funktionsargument Folgendes sinhinzugefügt r: sin(\x r), wodurch das Funktionsargument von Radiant in Grad umgewandelt wird.

  • Bei der Definition der Domäne wird ein kleiner Trick verwendet. Da die Domäne von acht Funktionsintervallen länger als die Textbreite ist, wird die Domäne auf die Hälfte verkürzt (auf 16*pi`` and the same time the widths of intervals is shortened to0,5*\x` (das verdoppelt die Funktionsfrequenz):

\draw[blue] plot[domain=0:16*pi, samples=320] (0.5*\x,{2*sin(\x r)});
  • Die gezeichnete Funktion ist glatt, ich habe 20 Samples pro Radiant verwendet (insgesamt 320 Samples).

Bildbeschreibung hier eingeben

Antwort2

Frequenz, Periode und Amplitude der Sinuswelle mit Farbe als Optionen im picSet angeben. Das Raster wird entsprechend den Frequenz-, Perioden- und Amplitudenwerten gezeichnet. foreachDie Schleife tikzsetbeginnt mit Null und die Frequenz wird mit gezeichnet 0 to f-1. Das Zeichnen der Sinuskurve basiert auf TiKz-Grundlagen.

\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ür f=8und :p=4a=2\pic {sw={color=blue,f=8,p=4,a=2}};

Bildbeschreibung hier eingeben

Für f=4und :p=5a=3\pic {sw={color=red,f=4,p=5,a=3}};

Bildbeschreibung hier eingeben

NACHTRAG: Hinzufügen einiger Funktionen zum Code:

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

Bildbeschreibung hier eingeben

Antwort3

Ein sehr grober Ausgangspunkt mit foreachSchleifen. Nicht elegant (meiner Meinung nach), aber bietet eine Möglichkeit.

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

Trotzdem bin ich ziemlich sicher, dass Sie noch viel mehr tun können :)

Bildbeschreibung hier eingeben

verwandte Informationen