这个例子这里给出使用 TikZ 绘制平面分区的代码。我想同时做两件事:
- 在任何平面分区中显示的顶部立方体的顶面上标注数字,以指示该堆叠中的立方体数量。(当然,数字应该是倾斜的。)
- 更改平面分区中的角度,使查看者看起来好像在“从比代码当前给出的更高的有利位置”俯视平面分区。(轴的角度可以从当前的 210、-30、90 度调整为 220、40、90 度。)我想这样做,以便可以绘制堆叠的立方体,就像平面分区一样,但可能某些“内部”(最近)立方体比堆叠在墙壁上的立方体更高。
任何帮助都将不胜感激。以下是 MWE(取自上面的示例):
% Plane partition
% Author: Jang Soo Kim
\documentclass{minimal}
\usepackage{tikz}
% Three counters
\newcounter{x}
\newcounter{y}
\newcounter{z}
% The angles of x,y,z-axes
\newcommand\xaxis{210}
\newcommand\yaxis{-30}
\newcommand\zaxis{90}
% The top side of a cube
\newcommand\topside[3]{
\fill[fill=yellow, draw=black,shift={(\xaxis:#1)},shift={(\yaxis:#2)},
shift={(\zaxis:#3)}] (0,0) -- (30:1) -- (0,1) --(150:1)--(0,0);
}
% The left side of a cube
\newcommand\leftside[3]{
\fill[fill=red, draw=black,shift={(\xaxis:#1)},shift={(\yaxis:#2)},
shift={(\zaxis:#3)}] (0,0) -- (0,-1) -- (210:1) --(150:1)--(0,0);
}
% The right side of a cube
\newcommand\rightside[3]{
\fill[fill=blue, draw=black,shift={(\xaxis:#1)},shift={(\yaxis:#2)},
shift={(\zaxis:#3)}] (0,0) -- (30:1) -- (-30:1) --(0,-1)--(0,0);
}
% The cube
\newcommand\cube[3]{
\topside{#1}{#2}{#3} \leftside{#1}{#2}{#3} \rightside{#1}{#2}{#3}
}
% Definition of \planepartition
% To draw the following plane partition, just write \planepartition{ {a, b, c}, {d,e} }.
% a b c
% d e
\newcommand\planepartition[1]{
\setcounter{x}{-1}
\foreach \a in {#1} {
\addtocounter{x}{1}
\setcounter{y}{-1}
\foreach \b in \a {
\addtocounter{y}{1}
\setcounter{z}{-1}
\foreach \c in {1,...,\b} {
\addtocounter{z}{1}
\cube{\value{x}}{\value{y}}{\value{z}}
}
}
}
}
\begin{document}
\begin{tikzpicture}
\planepartition{{5,3,2,2},{4,2,2,1},{2,1},{1}}
\end{tikzpicture}
\end{document}
答案1
不确定它是否符合要求,但至少相当容易玩:
\documentclass[border=0.125cm]{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[x=(220:1cm), y=(-40:1cm), z=(90:0.707cm)]
\foreach \m [count=\y] in {{5,3,2,2},{4,2,2,1},{2,1},{1}}{
\foreach \n [count=\x] in \m {
\ifnum \n>0
\foreach \z in {1,...,\n}{
\draw [fill=blue!30] (\x+1,\y,\z) -- (\x+1,\y+1,\z) -- (\x+1, \y+1, \z-1) -- (\x+1, \y, \z-1) -- cycle;
\draw [fill=blue!40] (\x,\y+1,\z) -- (\x+1,\y+1,\z) -- (\x+1, \y+1, \z-1) -- (\x, \y+1, \z-1) -- cycle;
\draw [fill=blue!10] (\x,\y,\z) -- (\x+1,\y,\z) -- (\x+1, \y+1, \z) -- (\x, \y+1, \z) -- cycle;
}
\node at (\x+0.5, \y+0.5, \n) {\n};
\fi
}
}
\end{tikzpicture}
\end{document}