Сложные 3D-чертежи с tikz

Сложные 3D-чертежи с tikz

Я уже создал следующую картинку с помощью 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}

Что приводит к следующему рисунку:

введите описание изображения здесь

Есть еще несколько отличий (маркеры не выровнены, нет штриховки), но это решаемо. Более сложная вещь — оптимизировать код, который — полный бардак^^

И я не знаю, как расставить лица так, чтобы они спрятались в правильном порядке.

Связанный контент