\foreach mit Animation in Tikz

\foreach mit Animation in Tikz

Ich versuche, die hier gezeigte Animation zu ändernBeispiel: Sinus- und Cosinusfunktionen-Animationeinzuschließen phase, so dass die Drehung jedes Mal in einem anderen Winkel beginnt, d. h. phase =[0, 45 ,-45], ich habe foreach wie unten verwendet. Die Originalanimation wird in angezeigtBeispiel: Sinus- und Cosinusfunktionen-Animation, aber der Code funktionierte nicht(Bitte heben Sie die Kommentarzeichen aus den entsprechenden Befehlen zur Animation auf, um den Fehler zu überprüfen, den ich erhalte.).

\documentclass[tikz]{standalone}
\usepackage{tikz}

\begin{document}
%\newcounter{theangle}
%\setcounter{theangle}{0}
    \begin{tikzpicture}
        \def\angle{45};
        \fill[fill=red] (0,0) -- plot [domain=0:pi/180*\angle] (\x,{sin(\x r)}) -- (pi/180*\angle,0) -- cycle;
    \end{tikzpicture}
    
    %\begin{animateinline}[loop, poster = first,controls]{40}
     %
     %\foreach \angle in {0,45,-45}
     %\whiledo{\angle<359}{

    \foreach \angle in {0,10,...,360}
    {
        \begin{tikzpicture}
        %\fill[blue!50] (-1,0) arc (0:\angle:1) -- (-2,0) -- cycle;
        %\fill[blue!50] plot[smooth,domain=0:\angle] (pi/180*\x,{sin(\x)}) |- (0,0);
        \def\radangle{pi/180*\angle};

        \fill[blue!50] (-1,0) arc (0:\angle:1) -- (-2,0) -- cycle;
        %\fill[fill=red] (0,0) -- plot [domain=0:\radangle] (\x,{sin(\x r)}) -- (\radangle,0) -- cycle;
        
        \draw (-2,0) +(\angle:1) circle (2pt) -- (pi/180*\angle,{sin(\angle)}) circle (2pt);
        \draw (-3.5,0) -- (7,0);
        \foreach \deg in {90, 180, 270, 360}
            \draw (pi/180*\deg,2pt) -- (pi/180*\deg,-2pt) node[below] {$\deg^\circ$};
        \draw (0,-1.2) -- (0,1.2);
        \foreach \y in {-1,-0.5,0.5,1}
        \draw (2pt,\y) -- (-2pt,\y) node[left] {$\y$};
        \draw plot[smooth,domain=0:360] (pi/180*\x,{sin(\x)});
        \draw (-2,0) circle (1);
        \end{tikzpicture}
            %
     %   \stepcounter{theangle}
     %    \ifthenelse{\theangle<359}{\newframe}{
     %            \end{animateinline}}
    }

\end{document}

Bildbeschreibung hier eingeben

Antwort1

Das Beispiel verwendet \clist_map_inline:nnaus LaTeX3 statt aus TikZ, \foreachum über die kommagetrennte Liste der Phasenverschiebungen zu iterieren. Aus irgendeinem Grund \foreachfunktioniert es innerhalb von nicht animateinline.

An geeigneten Stellen der Animation sind einige Pausen ( \newframe*) eingefügt; klicken Sie auf den Play-Button oder das Animations-Widget, um fortzufahren:

(Zum Anzeigen der SVG-Version wird ein Chromium-basierter Browser empfohlen, da Firefox etwas langsam ist.)

\documentclass{standalone}

\usepackage[T1]{fontenc}
\usepackage{tikz,animate}

\ExplSyntaxOn
\let\clistMap\clist_map_inline:nn
\ExplSyntaxOff

\newcommand{\drawit}[2]{% #1 angle (0<=#1<=360)
  \begin{tikzpicture}   % #2 phase shift

  \pgfmathsetmacro\angleRad{pi/180*(#1+#2)}
  \pgfmathsetmacro\angleDeg{#1+#2}

  \pgfmathsetmacro\unshiftedRad{pi/180*(#1)}

  \fill[blue!50] (-2,0) -- ++(#2:1) arc (#2:\angleDeg:1) -- cycle;
  
  \draw (-2,0) +(\angleDeg:1) circle (2pt) -- (\unshiftedRad,{sin(\angleDeg)}) circle (2pt);
  \draw (-3.5,0) -- (7,0);
  \foreach \deg in {90, 180, 270, 360}
      \draw (pi/180*\deg,2pt) -- (pi/180*\deg,-2pt) node[below] {$\deg^\circ$};
  \draw (0,-1.2) -- (0,1.2);
  \foreach \y in {-1,-0.5,0.5,1}
  \draw (2pt,\y) -- (-2pt,\y) node[left] {$\y$};
    \draw plot[smooth,domain=0:360] (pi/180*\x,{sin(\x+#2)});
  \draw (-2,0) circle (1);
  \node [anchor=north east] at (current bounding box.north east) {$\varphi=#2^\circ$};
  \end{tikzpicture}%
}

\begin{document}

\begin{animateinline}[controls]{30}
  \clistMap{0,45,-45}{%
    \drawit{0}{#1}
    \newframe*
    \multiframe{360}{i=1+1}{\drawit{\i}{#1}}%
    \ifthenelse{#1=-45}{}{\newframe*}%
  }  
\end{animateinline}

\end{document}

verwandte Informationen