以下 LaTeX 代码模仿的是这个答案,于 得救~/Test.tex
。
\documentclass[tikz,border=1cm]{standalone}
\newcommand{\tikzcube}[2][1]{% scale, side length
\begin{tikzpicture}[scale=#1]
\foreach \x in {0,...,#2}
{
\draw (\x,0,#2) -- (\x,#2,#2);
\draw (\x,#2,#2) -- (\x,#2,0);
}
\foreach \x in {0,...,#2}
{
\draw (#2,\x,#2) -- (#2,\x,0);
\draw (0,\x,#2) -- (#2,\x,#2);
}
\foreach \x in {0,...,#2}
{
\draw (#2,0,\x) -- (#2,#2,\x);
\draw (0,#2,\x) -- (#2,#2,\x);
}
\end{tikzpicture}%
}
\begin{document}
\tikzcube{3}
\end{document}
然后在终端中执行以下命令。
> cd ~
> lualatex Test
因此文件~/Test.pdf
已创建。在 PDF 查看器中打开时,文件显示如下。
想象一下,这个立方体由三层组成,每层呈塔状排列,一层叠在另一层之上。
我希望能够指定一种颜色和级别,并使用指定的颜色为相应的级别着色。
立方体应被视为不透明的,因此颜色应仅影响外墙。因此,当指定顶层时,颜色应影响两个可见侧面以及“屋顶”,然而,当指定其他层之一时,颜色应仅影响侧面。
魔方不一定有 3 个层,可以是任意数量的层:1、2、3、4、5 等。无论有多少层,它仍然是一个魔方。
答案1
您可以观察到在第二个 foreach 循环中绘制了一个级别:在线的侧面(#2,\x,#2) -- (#2,\x,0)
和线的前面。 您可以通过用零索引级别填充线和线(0,\x,#2) -- (#2,\x,#2)
之间的区域来为级别着色,或者用一索引级别填充线和线之间的区域,就像我在下面的 MWE 中所做的那样。\x
\x+1
\x-1
\x
顶部是四个角 (0,max,0)、(0,max,max)、(max,max,max) 和 (max,max,0) 之间的多边形。
梅威瑟:
\documentclass{article}
\usepackage{tikz}
\newcommand{\tikzcube}[2][1]{% scale, side length
\begin{tikzpicture}[scale=#1]
\edef\lvprev{\numexpr\cllv-1}
% side
\fill[\lvcl] (#2,\lvprev,#2) -- (#2,\lvprev,0) -- (#2,\cllv,0) -- (#2,\cllv,#2) -- cycle;
% front
\fill[\lvcl] (0,\lvprev,#2) -- (#2,\lvprev,#2) -- (#2,\cllv,#2) -- (0,\cllv,#2) -- cycle;
% top
\ifnum\cllv=#2\relax
\fill[\lvcl] (0,#2,0) -- (0,#2,#2) -- (#2,#2,#2) -- (#2,#2,0) -- cycle;
\fi
\foreach \x in {0,...,#2}
{
\draw (\x,0,#2) -- (\x,#2,#2);
\draw (\x,#2,#2) -- (\x,#2,0);
}
\foreach \x in {0,...,#2}
{
\draw (#2,\x,#2) -- (#2,\x,0);
\draw (0,\x,#2) -- (#2,\x,#2);
}
\foreach \x in {0,...,#2}
{
\draw (#2,0,\x) -- (#2,#2,\x);
\draw (0,#2,\x) -- (#2,#2,\x);
}
\end{tikzpicture}%
}
\begin{document}
\def\lvcl{blue}
\def\cllv{2}
\tikzcube{3}
\def\lvcl{green}
\def\cllv{5}
\tikzcube{5}
\end{document}.
结果:
答案2
对于仅在与轴正交的平面上的图形,简单的3d
图书馆它的canvas is ?? plane at ?
样式使得绘制这个立方体变得相当容易,因为我们可以使用rectangle
路径操作来绘制每个正方形,而不必写下所有四个角。
下面的图片
- 遍历所有层级,
- 然后遍历所有三条边,并
- 然后最后遍历所有等级该层那边的正方形。
- 然后遍历所有三条边,并
我们甚至将其用于顶部,但强制它使用最高级别的样式。
代码
\documentclass[tikz]{standalone}
\usetikzlibrary{3d}
\newcommand*{\tikzOpaqueCube}[2][1]{%
\begin{tikzpicture}[
l/.style args={##1:##2}{opaque cube/level ##1/.append style={fill=##2}},
L/.style 2 args={
/utils/temp/.style={opaque cube/level ####1/.append style={##2}},
/utils/temp/.list={##1}},#1]
\foreach \level in {1,...,#2}{
\foreach \xyz/\plane/\Level in {
z/xy/\level, % the front side → uses style of current \level
x/zy/\level, % the right side → uses style of current \level
y/xz/#2}{ % the top side → force style of top level
\foreach \llevel in {1, ..., #2} {
\draw[
line join=round,
canvas is \plane\space plane at \xyz={#2},
opaque cube/level \Level/.try]
(xyz cs: x=\llevel-1, y=\level-1) rectangle
(xyz cs: x=\llevel, y=\level );
}
}
}
\end{tikzpicture}}
\begin{document}
\tikzOpaqueCube[
l=1:red, l=3:green, l=5:blue,
L={2,4}{rounded corners},
]{5}
\end{document}