不完整的立方体

不完整的立方体

我想要画一个不完整的立方体,如下图所示。

在此处输入图片描述

但是,我只能画一个完整的立方体,见下文。

在此处输入图片描述

\documentclass[12pt]{article}
\usepackage{tikz}
\usepackage{verbatim}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}[on grid][scale=1.4]
  \shade[yslant=-0.5,right color=white, left color=white]
    (0,0) rectangle +(3,3);
  \draw[yslant=-0.5] (0,0) grid (3,3);
  \shade[yslant=0.5,right color=white,left color=white]
    (3,-3) rectangle +(3,3);
  \draw[yslant=0.5] (3,-3) grid (6,0);
  \shade[yslant=0.5,xslant=-1,bottom color=white,
    top color=white] (6,3) rectangle +(-3,-3);
  \draw[yslant=0.5,xslant=-1] (3,0) grid (6,3);
\end{tikzpicture}
\end{document}

答案1

我想说的是,应该使用正交投影,并以可以改变视角的方式编写。关于这一点已经有很多帖子了,也许最令人印象深刻的是这个用 s 为单位立方体来绘制缺少一些小立方体的 3d 立方体的想法pic也不是什么新鲜事,它已经被使用这里,其中立方体可以在 3d 中旋转。我只是重新利用代码来获得

\documentclass[tikz,border=3.14mm]{standalone}
\usepackage{tikz-3dplot}
\usetikzlibrary{calc}
\tikzset{plane/.style n args={3}{insert path={%
#1 -- ++ #2 -- ++ #3 -- ++ ($-1*#2$) -- cycle}},
unit xy plane/.style={plane={#1}{(1,0,0)}{(0,1,0)}},
unit xz plane/.style={plane={#1}{(1,0,0)}{(0,0,1)}},
unit yz plane/.style={plane={#1}{(0,1,0)}{(0,0,1)}},
get projections/.style={insert path={%
let \p1=(1,0,0),\p2=(0,1,0)  in 
[/utils/exec={\pgfmathtruncatemacro{\xproj}{sign(\x1)}\xdef\xproj{\xproj}
\pgfmathtruncatemacro{\yproj}{sign(\x2)}\xdef\yproj{\yproj}
\pgfmathtruncatemacro{\zproj}{sign(cos(\tdplotmaintheta))}\xdef\zproj{\zproj}}]}},
pics/unit cube/.style={code={
\path[get projections];
\draw (0,0,0) -- (1,1,1);
\ifnum\zproj=-1
 \path[3d cube/every face,3d cube/xy face,unit xy plane={(0,0,0)}]; 
\fi
\ifnum\yproj=1
 \path[3d cube/every face,3d cube/yz face,unit yz plane={(1,0,0)}]; 
\else
 \path[3d cube/every face,3d cube/yz face,unit yz plane={(0,0,0)}]; 
\fi
\ifnum\xproj=1
 \path[3d cube/every face,3d cube/xz face,unit xz plane={(0,0,0)}]; 
\else
 \path[3d cube/every face,3d cube/xz face,unit xz plane={(0,1,0)}]; 
\fi
\ifnum\zproj>-1
 \path[3d cube/every face,3d cube/xy face,unit xy plane={(0,0,1)}]; 
\fi
}},
3d cube/.cd,
xy face/.style={fill=gray!20},
xz face/.style={fill=gray!50},
yz face/.style={fill=gray!90},
every face/.style={draw,very thick}
}
\begin{document}
\foreach \Angle in {5,15,...,355} 
{\tdplotsetmaincoords{60}{\Angle} % the first argument cannot be larger than 90
\begin{tikzpicture}[line join=round]
 \pgfmathtruncatemacro{\NumCubes}{7}
 \path[use as bounding box] (-\NumCubes/2-3,-\NumCubes/2-2) 
 rectangle (\NumCubes/2+3,\NumCubes/2+4);
 \begin{scope}[tdplot_main_coords]
  \pgfmathtruncatemacro{\NextToLast}{\NumCubes-1}
  \path[get projections];
  \ifnum\yproj=1
   \def\LstX{1,2,3}
  \else 
   \def\LstX{3,2,1}
  \fi
  \ifnum\xproj=-1
   \def\LstY{1,2,3}
  \else 
   \def\LstY{3,2,1}
  \fi
  \foreach \X in \LstX
  {\foreach \Y in \LstY
   {\ifnum\Y=3
    \pgfmathtruncatemacro{\Zmax}{5-max(\X,2)}
   \else
    \pgfmathtruncatemacro{\Zmax}{4-\X}
   \fi
   \foreach \Z in {1,...,\Zmax}
    {\path (\X-2,\Y-2,\Z-1) pic{unit cube};}}
  }
 \end{scope}
\end{tikzpicture}}
\end{document}

在此处输入图片描述

答案2

您可以定义一个立方体并将pic其放置在您想要的位置(从后下方到前上方)。

\documentclass[tikz,border=7pt]{standalone}
\tikzset{
  cube/.pic={
    \draw[fill=black!20] (0,1,0) -- (0,1,1) -- (1,1,1) -- (1,1,0);
    \draw[fill=black!50] (1,0,0) -- (1,0,1) -- (1,1,1) -- (1,1,0);
    \draw[fill=white] (0,0,0) rectangle (1,1,0);
  }
}
\begin{document}
  \tikz[z={(.4,.3)}]\path\pgfextra{\def~{pic{cube}}} % <--- to make the code shorter
      (2,0,2)~(2,0,1)~(0,0,0)~(1,0,0)~(2,0,0)~
      (2,1,2)~(1,1,1)~(0,1,0)~(1,1,0)~
      (0,2,2)~(1,2,2)~(0,2,1)~(0,2,0)~;
\end{document}

在此处输入图片描述

答案3

只是为了好玩:一切都是2D的

\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\draw (0,0) rectangle (1,1) (1,1) rectangle (2,2) (0,1) rectangle (1,2) (0,2) rectangle (1,3) (1,0) rectangle (2,1) (2,0) rectangle (3,1);
\draw (3.6,1.6)--(3.6,.6)--(3,0)--(3,1)--cycle--(3.6,2.6)--(2.6,2.6)--(2.6,3.6)--(.6,3.6)--(0,3);
\draw (2,1)--(2.4,1.4) (2,2)--(2.6,2.6) (1,2)--(1.4,2.4) (1,3)--(1.6,3.6) (2.4,3.4)--(2.6,3.6) (3.4,2.4)--(3.6,2.6); 
\draw (2.4,1.4) rectangle (3.4,2.4) (1.4,2.4) rectangle (2.4,3.4);
\draw (.4,3.4)--(1.4,3.4) (3.4,1.4)--(3.4,.4) (.2,3.2)--(1.2,3.2)--(1.2,2.2)--(2.2,2.2)--(2.2,1.2)--(3.2,1.2)--(3.2,.2);
\end{tikzpicture}
\end{document}

在此处输入图片描述

带有颜色

\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\fill[black!70] (3,0)--(3.6,.6)--(3.6,2.6)--(3.4,2.4)--(3.4,1.4)--(3,1)--cycle (2.4,2.4)--(2.6,2.6)--(2.6,3.6)--(2.4,3.4)--(2.4,1.4)--(2,1)--(2,2)--cycle (1,2)--(1.4,2.4)--(1.4,3.4)--(1,3)--cycle;
\fill[black!30] (0,3)--(.6,3.6)-_(2.6,3.6)--(2.4,3.4)--(1.4,3.4)--(1,3)--cycle (2.4,2.4)--(2.6,2.6)--(3.6,2.6)--(3.4,2.4)--(1.4,2.4)--(1,2)--(2,2)--cycle (2,1)--(2.4,1.4)--(3.4,1.4)--(3,1)--cycle;
\draw (0,0) rectangle (1,1) (1,1) rectangle (2,2) (0,1) rectangle (1,2) (0,2) rectangle (1,3) (1,0) rectangle (2,1) (2,0) rectangle (3,1);
\draw (3.6,1.6)--(3.6,.6)--(3,0)--(3,1)--cycle--(3.6,2.6)--(2.6,2.6)--(2.6,3.6)--(.6,3.6)--(0,3);
\draw (2,1)--(2.4,1.4) (2,2)--(2.6,2.6) (1,2)--(1.4,2.4) (1,3)--(1.6,3.6) (2.4,3.4)--(2.6,3.6) (3.4,2.4)--(3.6,2.6); 
\draw (2.4,1.4) rectangle (3.4,2.4) (1.4,2.4) rectangle (2.4,3.4);
\draw (.4,3.4)--(1.4,3.4) (3.4,1.4)--(3.4,.4) (.2,3.2)--(1.2,3.2)--(1.2,2.2)--(2.2,2.2)--(2.2,1.2)--(3.2,1.2)--(3.2,.2);
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容