Estoy tratando de reproduciresta ilustraciónde unaleación de alta entropía(HEA) en TikZ:
Lo que tengo hasta ahora parece bastante soso porque no puedo encontrar una manera de asignar uno al azar de una lista de colores.
\documentclass[tikz]{standalone}
\def\colors{{red,green,blue,yellow}}
\begin{document}
\begin{tikzpicture}[]
\foreach \i in {1,...,12} {
\foreach \j in {1,...,6} {
\foreach \k in {1,...,4} {
\pgfmathparse{rnd}
\definecolor{randColor}{rgb}{\pgfmathresult,\pgfmathresult,\pgfmathresult}
\shade[ball color=randColor] (\i, {0.5*\j+\k}) circle(0.4);
}
}
}
\end{tikzpicture}
\end{document}
Dos preguntas:
¿Cómo puedo asignar uno de
\colors{{red,green,blue,yellow}}
forma aleatoria o aparentemente aleatoria según, por ejemplo?Mod(num, base)
a cada una de las bolas? no pude conseguirindexación de matricestrabajar:\shade[ball color=\colors[Mod(\i+\j+\k, 4)]
y
\pgfmathparse{\i+\j+\k} \shade[ball color=\colors[Mod(\pgfmathresult, 4)]]
ambos arrojan errores.
¿Se puede girar el ángulo de visión para parecerse a la imagen de destino?
Respuesta1
Creo que la forma más sencilla es definir los colores en una lista \pgfmathdeclarerandomlist
y luego puedes seleccionar un elemento aleatoriamente usando \pgfmathrandomitem
. Como tienes una TikZ
imagen 2D, cambiar la vista significa cambiar la posición (coordenadas) de las bolas.
Código:
\documentclass[tikz]{standalone}
\pgfmathdeclarerandomlist{colors}{%
{red}%
{green}%
{blue}%
{yellow}%
}
\begin{document}
\begin{tikzpicture}[]
\foreach \i in {1,...,12} {
\foreach \j in {1,...,6} {
\foreach \k in {1,...,4} {
\pgfmathrandomitem{\randColor}{colors}
\shade[ball color=\randColor] (\i-\j/3, {0.5*\j+\k}) circle(0.4);
}
}
}
\end{tikzpicture}
\end{document}
Por cierto, las respuestas aDibujo de red cristalina 3d con capa molecular en tikzmostrarte otras posibilidades para construir un cubo de "bolas" de este tipo. Estos también se pueden colorear al azar. Por ejemplo, para elrespuestadeJLDiaz:
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calc,fadings,decorations.pathreplacing}
\pgfmathdeclarerandomlist{colors}{%
{red}%
{green}%
{blue}%
{yellow}%
}
\begin{document}
% You can tweak these
\def\ballradius{0.45}
%
\def\DrawRow#1#2{
\foreach \x in {0,...,#2}
\pgfmathrandomitem{\randColor}{colors}
\shade[ball color=\randColor] ($(#1) +(\x, 0,0)$) circle(\ballradius);
}
\def\DrawOddPlane#1{
\pgfmathsetmacro{\aux}{#1-1}
\foreach \z in {0,...,#1} {
\DrawRow{0,0,\z}{#1}
\if\z#1\relax\else
\DrawRow{0.5,0,\z+0.5}{\aux}
\fi
}
}
\def\DrawEvenPlane#1{
\pgfmathsetmacro{\aux}{#1-1}
\foreach \z in {0,...,#1} {
\DrawRow{0.5,0,\z}{\aux}
\if\z#1\relax\else
\DrawRow{0,0,\z+0.5}{#1}
\fi
}
}
\begin{tikzpicture}
\foreach \y in {0,...,3} {
\begin{scope}[yshift=\y cm]
\DrawOddPlane{3}
\end{scope}
\if\y3\relax\else
\begin{scope}[yshift=\y cm + 0.5cm]
\DrawEvenPlane{3}
\end{scope}
\fi
}
\pgfmathsetmacro{\cubex}{1}
\pgfmathsetmacro{\cubey}{1}
\pgfmathsetmacro{\cubez}{1}
\draw (3,3,3) -- ++(-\cubex,0,0) -- ++(0,-\cubey,0) -- ++(\cubex,0,0) -- cycle;
\draw (3,3,3) -- ++(0,0,-\cubez) -- ++(0,-\cubey,0) -- ++(0,0,\cubez) -- cycle;
\draw (3,3,3) -- ++(-\cubex,0,0) -- ++(0,0,-\cubez) -- ++(\cubex,0,0) -- cycle;
\end{tikzpicture}
\end{document}
Respuesta2
Con la gran ayuda de @Ñako,aquí está el resultado final.
% Cartoon of the AlCoCrFeNi high entropy alloy (HEA) with body-centered cubic (BCC) lattice.
\documentclass[tikz]{standalone}
\pgfmathdeclarerandomlist{colors}{{red!80}{teal}{blue!80}{orange}{blue!20}}
\begin{document}
\begin{tikzpicture}
\foreach \i in {1,...,12} {
\foreach \j in {1,...,4} {
\foreach \k in {1,...,4} {
\pgfmathrandomitem{\randColor}{colors}
\shade[ball color=\randColor] (-\i+0.3*\j, -0.2*\j+1.2*\k) circle(0.3);
}
\foreach \k in {1,...,3} {
\pgfmathrandomitem{\randColor}{colors}
\shade[ball color=\randColor] (-\i+0.5+0.3*\j, -0.2*\j+1.2*\k+0.6) circle(0.3);
}
}
}
\foreach \el/\color [count=\n] in {Al/red!80, Co/blue!80, Cr/teal, Fe/orange, Ni/blue!20} {
\shade[ball color=\color] (2, 5.5-\n) circle(0.3) node[right=1em] {\el};
}
\end{tikzpicture}
\end{document}