Colorindo uma partição 3D longe de uma perna

Colorindo uma partição 3D longe de uma perna

Existem maneiras de colorir uma partição plana camada por camada; por exemplo, aprendi muito comesta postagem. Gostaria de colorir uma divisória com duas cores, uma cor para uma determinada perna em um canto, outra cor para todas as outras caixas.

Abaixo está o código que estou usando. No exemplo, há uma perna amarela “longa” (o eixo x), e eu gostaria que todo o resto fosse, digamos, verde. Posso fazer com que tudo que está em cima da perna amarela fique verde, mas não o que ainda está próximo à perna, ou seja, "no chão". Tenho certeza de que este é um problema trivial, mas realmente não sei como modificar o código.

\documentclass{article}

\usepackage{xifthen}
\usepackage{verbatim}

\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=cubecolor, 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=cubecolor, 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=cubecolor, 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}
}

\newcommand*\cubecolors[1]{%
\ifcase#1\relax
  \or\colorlet{cubecolor}{yellow}%
  \or\colorlet{cubecolor}{green}%
  \or\colorlet{cubecolor}{green}%
  \or\colorlet{cubecolor}{green}%
  \or\colorlet{cubecolor}{green}%
  \or\colorlet{cubecolor}{green}%
  \or\colorlet{cubecolor}{green}%
  \or\colorlet{cubecolor}{green}%
  \else
    \colorlet{cubecolor}{blue}%
  \fi
}

% 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}
        \cubecolors{\c}
        \cube{\value{x}}{\value{y}}{\value{z}}
      }
    }
  }
}

\usepackage{tikz}


\begin{document}

\begin{figure}[h]
\centering
\begin{tikzpicture}[scale=0.26]
\planepartition{{5,4,2,1},{3,2,1},{1,1},{1,1},{1},{1},{1},{1},{1},{1}}
\end{tikzpicture}
\end{figure}

\end{document}

Responder1

Deixe-me começar admitindo que nem tentei entender a lógica do seu código. No entanto, apenas introduzindo um switch

 \pgfmathtruncatemacro{\myc}{ifthenelse(\value{y}+\value{z}==0,1,2)}
 \cubecolors{\myc}

que testa apenas se ye zsão zero (você não usa números negativos), recebo

insira a descrição da imagem aqui

Se você também tiver coordenadas negativas, use

\pgfmathtruncatemacro{\myc}{ifthenelse(abs(\value{y})+abs(\value{z})==0,1,2)}

em vez de.

Código completo:

\documentclass{article}

\usepackage{xifthen}
\usepackage{verbatim}

\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=cubecolor, 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=cubecolor, 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=cubecolor, 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}
}

\newcommand*\cubecolors[1]{%
\ifcase#1\relax
  \or\colorlet{cubecolor}{yellow}%
  \or\colorlet{cubecolor}{green}%
  \or\colorlet{cubecolor}{green}%
  \or\colorlet{cubecolor}{green}%
  \or\colorlet{cubecolor}{green}%
  \or\colorlet{cubecolor}{green}%
  \or\colorlet{cubecolor}{green}%
  \or\colorlet{cubecolor}{green}%
  \else
    \colorlet{cubecolor}{blue}%
  \fi
}

% 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}
        \pgfmathtruncatemacro{\myc}{ifthenelse(\value{y}+\value{z}==0,1,2)}
        \cubecolors{\myc}
        \cube{\value{x}}{\value{y}}{\value{z}}
      }
    }
  }
}

\usepackage{tikz}


\begin{document}

\begin{figure}[h]
\centering
\begin{tikzpicture}[scale=0.26]
\planepartition{{5,4,2,1},{3,2,1},{1,1},{1,1},{1},{1},{1},{1},{1},{1}}
\end{tikzpicture}
\end{figure}

\end{document}

informação relacionada