Komplexe 3D-Zeichnungen mit Tikz

Komplexe 3D-Zeichnungen mit Tikz

Das folgende Bild habe ich bereits mittels erstellt TikZ. Bildbeschreibung hier eingeben Dazu habe ich das Sudoku-Beispiel modifiziert, das ich gefunden habeHierwie folgt:

\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}

Ich musste mehrere scopeUmgebungen mit demselben verwenden yslant, slantum die Ebenen so zu erhalten, dass sie sich korrekt überlagern.

Trotzdem bin ich mit dem Bild nicht so zufrieden, da ich die Ansicht nicht einfach ändern konnte. Gibt es eine effektivere Möglichkeit, ein solches Bild in TikZ (oder allgemeiner in LaTeX) zu zeichnen? Ich würde gerne TikZ verwenden (und das Bild nicht mit externen Programmen, z. B. MATLAB, erstellen), da ich Legenden, Beschriftungen und anderen Text in ein solches Bild einfügen muss. Außerdem vermute ich, dass dies pgfplotsdie Antwort ist, aber ich bin mir nicht sicher.

BEARBEITEN:Ich denke, eine umfassende Antwort kann von denjenigen kommen, die vollständig verstehendiese Antwortvon @Tom Bombadil.

Antwort1

Bisher konnte ich so etwas mit pgfplots zeichnen:

\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}

Was zu folgender Abbildung führt:

Bildbeschreibung hier eingeben

Es gibt noch ein paar Unterschiede (Markierungen sind nicht ausgerichtet, keine Schattierungen), aber das ist zu bewältigen. Das Kompliziertere ist die Optimierung des Codes, was ein Chaos ist^^

Und ich weiß nicht, wie ich die Reihenfolge der Gesichter so hinbekomme, dass sie sich in der richtigen Reihenfolge verstecken.

verwandte Informationen