Cómo crear un diagrama interactivo con TikZ

Cómo crear un diagrama interactivo con TikZ

Estoy tratando de crear uninteractivodiagrama, muy parecido al utilizado en los EPUB vendidos porIr libros:

Diagrama de Go Books - Posición inicial

Diagrama de Go Books - Mover 1

Lo que quiero decir con "interactivo" es que el usuario controla cuándo se activan las cosas. Por ejemplo, las animaciones no son lo que yo llamaría interactividad porque ocurren independientemente de lo que haga el usuario. (Por supuesto, entre cada movimiento, podríamos tener una animación).

Francamente, no sé si eso es posible con TikZ. ¿Lo es? ¿Quizás haya una forma de inyectar HTML y JS en TikZ?

Aquí hay un ejemplo mínimo de un tablero de Go con 3 movimientos, la idea sería que TikZ agregue algún tipo de interfaz de usuario para ir y venir, y luego mostrar cada movimiento en consecuencia (sin necesidad del botón de reproducción):

\documentclass{article}

\usepackage{tikz}

\newlength{\step}

\begin{document}
  \begin{tikzpicture}
    \setlength{\step}{\dimexpr 10cm / 18 \relax}

    \draw[step=\step] (0, 0) grid (10, 10);

    \draw[draw = white, fill = black, line width = 0.1mm]
      (2 * 10cm / 18, 3 * 10cm / 18)
      circle [radius = 0.2575cm]
      node[color = white] {1};
    \draw[draw = black, fill = white, line width = 0.1mm]
      (3 * 10cm / 18, 3 * 10cm / 18)
      circle [radius = 0.2575cm]
      node[color = black] {2};
    \draw[draw = white, fill = black, line width = 0.1mm]
      (4 * 10cm / 18, 3 * 10cm / 18)
      circle [radius = 0.2575cm]
      node[color = white] {3};
  \end{tikzpicture}
\end{document}

Respuesta1

Los créditos también deben ir aAlexG. Gracias por su increíble animatepaquete. Y el \playgocomando también proviene de su idea en estecorreo( \uncoverdominio).

A continuación se muestra un ejemplo que utiliza animateinlinefrom paquete animate. Está funcionando en Adobe Reader y Foxit Reader (no parece funcionar en el Visor de PDF de VS Code):

\documentclass{article}

\usepackage{tikz}
\usepackage{animate}

\newlength{\step}
\setlength{\step}{\dimexpr 10cm / 18 \relax}

\newcommand\playgo[3]{\ifnum#1<#2\phantom{#3}\else#3\fi}

\begin{document}
  \begin{animateinline}[step,controls=step]{1}
    \multiframe{4}{i=0+1}{
      \begin{tikzpicture}[x=\step,y=\step]
        %create the board 
        \draw[step=1] (0, 0) grid (18, 18);

        %setup black
        \foreach \bloc in {{2,4},{3,4},{4,4},{5,4},{6,5},{7,6}}{
          \filldraw[line width = 0.1mm] (\bloc) circle [radius = 0.2575cm];
        }

        %setup white
        \foreach \wloc in {{2,6},{3,6},{4,6},{5,6},{6,6},{7,7}}{
          \filldraw[fill=white,line width = 0.1mm] (\wloc) circle [radius = 0.2575cm];
        }

        %play the go-game start from black
        \foreach \stepnum/\loc in {1/{8,7},2/{8,8},3/{9,8}}{
          \playgo{\i}{\stepnum}{\filldraw[fill={\ifodd\stepnum black\else white\fi},line width = 0.1mm] (\loc) circle [radius = 0.2575cm] node [color = \ifodd\stepnum white\else black\fi] {\stepnum};}
        }
      \end{tikzpicture}
    }
  \end{animateinline}
\end{document}

Animaciones paso a paso

Y esta animación está controlada por esto:

Controles de animación

Actualizaciones: agregue una barra de progreso mostrada y un color elegante.

\documentclass{article}

\usepackage{tikz}
\usepackage{animate}

\newlength{\step}
\setlength{\step}{\dimexpr 10cm / 18 \relax}

\newcommand\playgo[3]{\ifnum#1<#2\phantom{#3}\else#3\fi}
\newcounter{totalsteps}
\setcounter{totalsteps}{3}

\begin{document}
{\centering
  \begin{animateinline}[step,controls=step]{1}
    \multiframe{\numexpr\value{totalsteps}+1}{i=0+1}{
      \begin{tikzpicture}[x=\step,y=\step]
        %create the board 
        \fill [brown!30] (-0.5,-0.5) rectangle (18.5,18.5);
        \draw[step=1] (0, 0) grid (18, 18);
        \draw [line width=2pt] (0,0) rectangle (18,18);
        \foreach \sloc in 
 {{3,3},{3,9},{3,15},{9,3},{9,9},{9,15},{15,3},{15,9},{15,15}}{\filldraw (\sloc) circle [radius=1.5pt];}
        %add progress bar
        \draw [rounded corners=3pt,blue!20] (5,-0.85) rectangle (13,-1.15);
        \fill [rounded corners=3pt,blue] (5,-0.85) rectangle ++(\i*13/\value{totalsteps}-\i*5/\value{totalsteps} ,-0.3);
        \filldraw [blue] (5,-0.85) ++ (\i*13/\value{totalsteps}-\i*5/\value{totalsteps} ,-0.15) circle [radius=5pt];
        %setup black
        \foreach \bloc in {{2,4},{3,4},{4,4},{5,4},{6,5},{7,6}}{
          \filldraw[line width = 0.1mm] (\bloc) circle [radius = 0.2575cm];
        }

        %setup white
        \foreach \wloc in {{2,6},{3,6},{4,6},{5,6},{6,6},{7,7}}{
          \filldraw[fill=white,line width = 0.1mm] (\wloc) circle [radius = 0.2575cm];
        }

        %play the go-game start from black
        \foreach \stepnum/\loc in {1/{8,7},2/{8,8},3/{9,8}}{
          \playgo{\i}{\stepnum}{\filldraw[fill={\ifodd\stepnum black\else white\fi},line width = 0.1mm] (\loc) circle [radius = 0.2575cm] node [color = \ifodd\stepnum white\else black\fi] {\stepnum};}
        }
      \end{tikzpicture}
    }
  \end{animateinline}\par}
\end{document}

ingrese la descripción de la imagen aquí

Respuesta2

Utilicé TikZ y el paquete animate para hacer la siguiente animación:

ingrese la descripción de la imagen aquí

El enfoque clásico es hacer las imágenes cuadro por cuadro en un .texarchivo, para matemáticas o figuras basadas en una especie de algoritmos, puedes usar bucles, es perfecto, pero en este caso hice un archivo cuadro por cuadro y lo nombré.Go-game.tex

\documentclass[tikz, border=30mm]{standalone}
\usetikzlibrary{fadings}
\definecolor{backcol}{HTML}{8b5a16}
\definecolor{wood}{HTML}{5d2f03}
\definecolor{gwhite}{HTML}{ecefe9}
\definecolor{gblack}{HTML}{221d1d}


\newcommand{\white}[1]{
\begin{scope}[shift={#1}]
\shade[top color=gwhite, bottom color=white] (0,0)circle(0.95);
\end{scope}
}

\newcommand{\black}[1]{
\begin{scope}[shift={#1}]
\shade[top color=gblack, bottom color=black] (0,0)circle(0.95);
\end{scope}
}

\begin{document}
\pagecolor{backcol}
\color{wood}
\foreach\i in {0, 10, 20, ..., 100}{
\begin{tikzpicture}
\draw[line width=0.5mm, step=2] (0,0)grid(16,16);
\white{(4,4)}
\white{(4,6)}

\node[opacity=\i/100, scale=3, text width=4cm, align =center, preaction={fill, wood}] at (8,14) {\color{white}In order to take over the white goishi we need};

\end{tikzpicture}
}
\foreach\i in {90, 80,..., 0}{
\begin{tikzpicture}
\draw[line width=0.5mm, step=2] (0,0)grid(16,16);
\white{(4,4)}
\white{(4,6)}

\node[opacity=\i/100, scale=3, text width=4cm, align =center, preaction={fill, wood}] at (8,14) {\color{white}In order to take over the white goishi we need};

\end{tikzpicture}
}

\foreach\i in {0, 10, 20, ..., 100}{
\begin{tikzpicture}
\draw[line width=0.5mm, step=2] (0,0)grid(16,16);
\white{(4,4)}
\white{(4,6)}

\node[opacity=\i/100, scale=3, text width=4cm, align =center, preaction={fill, wood}] at (8,14) {\color{white}To surround them using the black goishi};
\end{tikzpicture}
}
\foreach\i in {90, 80, 70, ..., 0}{
\begin{tikzpicture}
\draw[line width=0.5mm, step=2] (0,0)grid(16,16);
\white{(4,4)}
\white{(4,6)}

\node[opacity=\i/100, scale=3, text width=4cm, align =center, preaction={fill, wood}] at (8,14) {\color{white}To surround them using the black goishi};
\end{tikzpicture}
}


\begin{tikzpicture}
\draw[line width=0.5mm, step=2] (0,0)grid(16,16);
\white{(4,4)}
\white{(4,6)}
\black{(2,4)}
\end{tikzpicture}

\begin{tikzpicture}
\draw[line width=0.5mm, step=2] (0,0)grid(16,16);
\white{(4,4)}
\white{(4,6)}
\black{(2,4)}
\black{(4,2)}

\end{tikzpicture}

\begin{tikzpicture}
\draw[line width=0.5mm, step=2] (0,0)grid(16,16);
\white{(4,4)}
\white{(4,6)}
\black{(2,4)}
\black{(4,2)}
\black{(6,4)}
\end{tikzpicture}

\begin{tikzpicture}
\draw[line width=0.5mm, step=2] (0,0)grid(16,16);
\white{(4,4)}
\white{(4,6)}
\black{(2,4)}
\black{(4,2)}
\black{(6,4)}
\black{(6,6)}
\end{tikzpicture}

\begin{tikzpicture}
\draw[line width=0.5mm, step=2] (0,0)grid(16,16);
\white{(4,4)}
\white{(4,6)}
\black{(2,4)}
\black{(4,2)}
\black{(6,4)}
\black{(6,6)}
\black{(4,8)}
\end{tikzpicture}

\begin{tikzpicture}
\draw[line width=0.5mm, step=2] (0,0)grid(16,16);
\white{(4,4)}
\white{(4,6)}
\black{(2,4)}
\black{(4,2)}
\black{(6,4)}
\black{(6,6)}
\black{(4,8)}
\black{(2,6)}
\end{tikzpicture}

\foreach\i in {90, 80, 70, ...,0}{
\begin{tikzpicture}
\draw[line width=0.5mm, step=2] (0,0)grid(16,16);
\begin{scope}[opacity=\i/100]
\white{(4,4)}
\white{(4,6)}
\end{scope}
\black{(2,4)}
\black{(4,2)}
\black{(6,4)}
\black{(6,6)}
\black{(4,8)}
\black{(2,6)}
\end{tikzpicture}

}

\end{document}

Al compilar su archivo, Go-game.pdflo usaremos para animar nuestros cuadros:

\documentclass[tikz, border=40mm]{standalone}
\usepackage{animate}
\begin{document}
\animategraphics[controls=all, loop]{15}{Go-game}{}{}
\end{document}

Y sí, deberías poder obtener tu animación después de eso.

información relacionada