我想要画一个不完整的立方体,如下图所示。
但是,我只能画一个完整的立方体,见下文。
\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}