我已经通过 制作了下面的图片TikZ
。
为了做到这一点,我修改了数独示例这里如下:
\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}
我必须使用scope
相同的多个环境yslant
才能slant
使各层正确地相互叠加。
然而,我对这幅图不太满意,因为我无法轻松更改视图。有没有更有效的方法在 TikZ(或者更一般地说,在 LaTeX)中绘制这样的图片?我想使用 TikZ(而不是使用外部程序(例如 MATLAB)生成图片),因为我应该在这样的图片中插入图例、标签和其他文本内容。此外,我怀疑这pgfplots
是答案,但我不确定。
编辑:我认为那些完全理解的人才能给出完整的答案这个答案作者:@Tom Bombadil。
答案1
到目前为止,我已经能够使用 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}
由此得出下图:
还是有一些差异(标记不对齐,没有阴影)但可以控制。更复杂的事情是优化代码,这很乱^^
而且我不知道该如何管理这些面孔的顺序,让它们隐藏在良好的秩序中。