Ya he producido la siguiente imagen mediante TikZ
.
Para hacerlo, modifiqué el ejemplo de Sudoku encontrado.aquícomo sigue:
\documentclass{standalone}
\usepackage{xcolor}
\usepackage{tikz}
\usetikzlibrary{positioning,arrows}
\begin{document}
\fontsize{5}{6}
\begin{tikzpicture}[>=stealth,every node/.style={minimum size=1cm},on grid]
\begin{scope}[every node/.append style={yslant=-0.5},yslant=-0.5]
\shade[right color=gray!10, left color=black!50] (0,0) rectangle +(3,3);
\end{scope}
\begin{scope}[every node/.append style={yslant=0.5},yslant=0.5]
\shade[right color=gray!70,left color=gray!10] (3,-3) rectangle +(3,3);
\end{scope}
\begin{scope}[every node/.append style={yslant=0.5,xslant=-1},yslant=0.5,xslant=-1]
\shade[bottom color=gray!10, top color=black!50] (6,3) rectangle +(-3,-3);
\end{scope}
\begin{scope}[every node/.append style={yslant=-0.5},yslant=-0.5]
\foreach \i in {.5,1.5,...,2.5}
\foreach \j in {.5,1.5,...,2.5}
{
\node at (\i,\j) {$+$};
}
\foreach \i in {0,3}
\foreach \j in {.5,1.5,...,2.5}
{
\node at (\i,\j) {$+$};
}
\foreach \i in {.5,1.5,...,2.5}
\foreach \j in {0,3}
{
\node at (\i,\j) {$+$};
}
\foreach \i in {0,1,...,3}
\foreach \j in {.5,1.5,...,2.5}
{
\node at (\i,\j) {$+$};
}
\draw (0,0) grid (3,3);
\end{scope}
\begin{scope}[every node/.append style={yslant=0.5},yslant=0.5]
\foreach \i in {3.5,4.5,...,5.5}
\foreach \j in {-2.5,-1.5,...,-.5}
{
\node at (\i,\j) {$+$};
}
\foreach \i in {3,6}
\foreach \j in {-2.5,-1.5,...,-.5}
{
\node at (\i,\j) {$+$};
}
\foreach \i in {3.5,4.5,...,5.5}
\foreach \j in {-3,0}
{
\node at (\i,\j) {$+$};
}
\draw (3,-3) grid (6,0);
\end{scope}
\begin{scope}[every node/.append style={yslant=0.5,xslant=-1},yslant=0.5,xslant=-1]
\foreach \i in {3.5,4.5,...,5.5}
\foreach \j in {0.5,1.5,...,2.5}
{
\node at (\i,\j) {$+$};
}
\foreach \i in {3,6}
\foreach \j in {0.5,1.5,...,2.5}
{
\node at (\i,\j) {$+$};
}
\foreach \i in {3.5,4.5,...,5.5}
\foreach \j in {0,3}
{
\node at (\i,\j) {$+$};
}
\draw (3,0) grid (6,3);
\end{scope}
\begin{scope}[every node/.append style={yslant=-0.5},yslant=-0.5]
\foreach \i in {.5,1.5,...,2.5}
\foreach \j in {.5,1.5,...,2.5}
{
\draw[<-] (\i,\j) -- +(-.2,-.2);
}
\foreach \i in {0,3}
\foreach \j in {.5,1.5,...,2.5}
{
\draw[red,<-] (\i,\j) -- +(-.2,-.2);
}
\foreach \i in {.5,1.5,...,2.5}
\foreach \j in {0,3}
{
\draw[red,<-] (\i,\j) -- +(-.2,-.2);
}
\foreach \i in {0,1,...,3}
\foreach \j in {.5,1.5,...,2.5}
{
\draw[red,->] (\i,\j) -- +(.2,0);
}
\foreach \i in {.5,1.5,...,2.5}
\foreach \j in {0,1,...,3}
{
\draw[red,->] (\i,\j) -- +(0,.2);
}
\end{scope}
\begin{scope}[every node/.append style={yslant=0.5},yslant=0.5]
\foreach \i in {3.5,4.5,...,5.5}
\foreach \j in {-2.5,-1.5,...,-.5}
{
\draw[->] (\i,\j) -- +(.2,-.2);
}
\foreach \i in {3,6}
\foreach \j in {-2.5,-1.5,...,-.5}
{
\draw[red,->] (\i,\j) -- +(.2,-.2);
}
\foreach \i in {3.5,4.5,...,5.5}
\foreach \j in {-3,0}
{
\draw[red,->] (\i,\j) -- +(.2,-.2);
}
\foreach \i in {3,4,...,6}
\foreach \j in {-2.5,-1.5,...,-.5}
{
\draw[red,->] (\i,\j) -- +(.2,0);
}
\foreach \i in {3.5,4.5,...,5.5}
\foreach \j in {-3,-2,...,0}
{
\draw[red,->] (\i,\j) -- +(0,.2);
}
\end{scope}
\begin{scope}[every node/.append style={yslant=0.5,xslant=-1},yslant=0.5,xslant=-1]
\foreach \i in {3.5,4.5,...,5.5}
\foreach \j in {0.5,1.5,...,2.5}
{
\draw[->] (\i,\j) -- +(.2,.2);
}
\foreach \i in {3,6}
\foreach \j in {0.5,1.5,...,2.5}
{
\draw[red,->] (\i,\j) -- +(.2,.2);
}
\foreach \i in {3.5,4.5,...,5.5}
\foreach \j in {0,3}
{
\draw[red,->] (\i,\j) -- +(.2,.2);
}
\foreach \i in {3,4,...,6}
\foreach \j in {0.5,1.5,...,2.5}
{
\draw[red,->] (\i,\j) -- +(.2,0);
}
\foreach \i in {3.5,4.5,...,5.5}
\foreach \j in {0,1,...,3}
{
\draw[red,->] (\i,\j) -- +(0,-.2);
}
\end{scope}
\end{tikzpicture}
\end{document}
Tuve que usar múltiples scope
entornos con el mismo yslant
y slant
para poder obtener las capas se superpongan correctamente entre sí.
Sin embargo, no estoy muy contento con la imagen, ya que no pude cambiar la vista fácilmente. ¿Existe una forma más efectiva de hacer un dibujo así en TikZ (o, más generalmente, en LaTeX)? Me gustaría usar TikZ (y no producir la imagen con programas externos, por ejemplo MATLAB), ya que debo insertar leyendas, etiquetas y otro texto en dicha imagen. Además, sospecho pgfplots
que es la respuesta, pero no estoy seguro.
EDITAR:Creo que una respuesta completa puede venir de aquellos que entienden completamenteesta respuestapor @Tom Bombadil.
Respuesta1
Hasta ahora he podido dibujar algo así usando pgfplots:
\documentclass{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.12}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
xmin=0,
xmax=1,
ymin=0,
ymax=1,
zmin=0,
zmax=1,
axis equal,
ticks=none,
hide axis,
]
%lower face, drawn first as it will be hidden
\addplot3[black,/pgfplots/quiver,
quiver/u=0,
quiver/v=0,
quiver/w=0.1,
-{stealth[]},
samples=3,
domain=0.16666:0.8333,
]{0};
\addplot3[red,/pgfplots/quiver,
quiver/u=0.1,
quiver/v=0,
quiver/w=0,
-stealth,
samples=4,
domain y=0.16666:0.8333,
samples y=3,
domain=0:1,
]{0};
\addplot3[red,/pgfplots/quiver,
quiver/u=0,
quiver/v=-0.1,
quiver/w=0,
stealth-,
samples=3,
domain=0.16666:0.8333,
samples y=4,
domain y=0:1,
]{0};
%hidden right face, drawn first as it will be hidden
\addplot3[black,/pgfplots/quiver,
quiver/u=0,
quiver/v=0,
quiver/w=0.1,
-{stealth[]},
samples=3,
domain=0.16666:0.8333,
](x,1,y);
\addplot3[red,/pgfplots/quiver,
quiver/u=0.1,
quiver/v=0,
quiver/w=0,
-stealth,
samples=4,
domain y=0.16666:0.8333,
samples y=3,
domain=0:1,
](x,1,y);
\addplot3[red,/pgfplots/quiver,
quiver/u=0,
quiver/v=0,
quiver/w=0.1,
-stealth,
samples=3,
domain=0.16666:0.8333,
samples y=4,
domain y=0:1,
](x,1,y);
%hidden left face, drawn first as it will be hidden
\addplot3[black,/pgfplots/quiver,
quiver/u=0,
quiver/v=0,
quiver/w=0.1,
-{stealth[]},
samples=3,
domain=0.16666:0.8333,
](0,x,y);
\addplot3[red,/pgfplots/quiver,
quiver/u=0,
quiver/v=-0.1,
quiver/w=0,
stealth-,
samples=4,
domain y=0.16666:0.8333,
samples y=3,
domain=0:1,
](0,x,y);
\addplot3[red,/pgfplots/quiver,
quiver/u=0,
quiver/v=0,
quiver/w=0.1,
-stealth,
samples=3,
domain=0.16666:0.8333,
samples y=4,
domain y=0:1,
](0,x,y);
% faces
\addplot3[surf,
color=black!40,
faceted color=black!80,
domain=0:1,
domain y=0:1,
samples=4,
samples y=4,
]
(x,0,y);
\addplot3[surf,
color=black!40,
faceted color=black!80,
domain=0:1,
domain y=0:1,
samples=4,
samples y=4,
]
{1};
\addplot3[surf,
color=black!40,
faceted color=black!80,
domain=0:1,
domain y=0:1,
samples=4,
samples y=4,
]
(1,x,y);
%upper face
\addplot3[black,/pgfplots/quiver,
quiver/u=0,
quiver/v=0,
quiver/w=0.1,
-{stealth[]},
samples=3,
domain=0.16666:0.8333,
]{1};
\addplot3[mark=x,
only marks,
samples=3,
domain=0.16666:0.8333,
]{1};
\addplot3[red,/pgfplots/quiver,
quiver/u=0.1,
quiver/v=0,
quiver/w=0,
-stealth,
samples=4,
domain y=0.16666:0.8333,
samples y=3,
domain=0:1,
]{1};
\addplot3[red,/pgfplots/quiver,
quiver/u=0,
quiver/v=0.1,
quiver/w=0,
-stealth,
samples=3,
domain=0.16666:0.8333,
samples y=4,
domain y=0:1,
]{1};
%left face
\addplot3[black,/pgfplots/quiver,
quiver/u=0,
quiver/v=-0.1,
quiver/w=0,
{stealth[]}-,
samples=3,
domain=0.16666:0.8333,
](x,0,y);
\addplot3[mark=x,
only marks,
samples=3,
domain=0.16666:0.8333,
](x,0,y);
\addplot3[red,/pgfplots/quiver,
quiver/u=0.1,
quiver/v=0,
quiver/w=0,
-stealth,
samples=4,
domain y=0.16666:0.8333,
samples y=3,
domain=0:1,
](x,0,y);
\addplot3[red,/pgfplots/quiver,
quiver/u=0,
quiver/v=0,
quiver/w=0.1,
-stealth,
samples=3,
domain=0.16666:0.8333,
samples y=4,
domain y=0:1,
](x,0,y);
%right face
\addplot3[black,/pgfplots/quiver,
quiver/u=0.1,
quiver/v=0,
quiver/w=0,
-{stealth[]},
samples=3,
domain=0.16666:0.8333,
](1,x,y);
\addplot3[mark=x,
only marks,
samples=3,
domain=0.16666:0.8333,
](1,x,y);
\addplot3[red,/pgfplots/quiver,
quiver/u=0,
quiver/v=0.1,
quiver/w=0,
-stealth,
samples=4,
domain y=0.16666:0.8333,
samples y=3,
domain=0:1,
](1,x,y);
\addplot3[red,/pgfplots/quiver,
quiver/u=0,
quiver/v=0,
quiver/w=0.1,
-stealth,
samples=3,
domain=0.16666:0.8333,
samples y=4,
domain y=0:1,
](1,x,y);
\end{axis}
\end{tikzpicture}
\end{document}
Lo que lleva a la siguiente figura:
Todavía hay algunas diferencias (los marcadores no están alineados, no hay sombras) pero es manejable. Lo más complicado es optimizar el código, que es un desastre ^^
Y no sé cómo gestionar el orden de las caras para que se oculten en buen orden.