如何为立方体的各个层面着色?

如何为立方体的各个层面着色?

以下 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}

输出

在此处输入图片描述

相关内容