Высокоэнтропийный сплав в TikZ

Высокоэнтропийный сплав в TikZ

Я пытаюсь воспроизвестиэта иллюстрацияизсплав с высокой энтропией(HEA) в TikZ:

высокоэнтропийный сплав иллюстрация

То, что у меня есть на данный момент, выглядит довольно скучно, потому что я не могу найти способ случайным образом назначить один из цветов из списка.

TikZ черно-белый HEA

\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}

Два вопроса:

  • Как я могу назначить одно из \colors{{red,green,blue,yellow}}двух: случайное или кажущееся случайным, например, на основеMod(num, base)к каждому из шаров? Я не смог получитьиндексация массиваработать:

    \shade[ball color=\colors[Mod(\i+\j+\k, 4)]
    

    и

    \pgfmathparse{\i+\j+\k}
    \shade[ball color=\colors[Mod(\pgfmathresult, 4)]]
    

    оба выдают ошибки.

  • Можно ли повернуть угол обзора так, чтобы он напоминал целевое изображение?

решение1

Я думаю, что самый простой способ — это определить цвета в списке с помощью , \pgfmathdeclarerandomlistа затем вы можете случайным образом выбрать элемент с помощью \pgfmathrandomitem. Поскольку у вас есть 2D- TikZизображение, изменение вида означает изменение положения (координат) шаров.

введите описание изображения здесь

Код:

\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}

Кстати, ответы наРисунок 3d кристаллической решетки с молекулярным слоем в тикзпоказать вам другие возможности построить такой куб из "шариков". Они также могут быть окрашены случайным образом. Например, дляотвечатьизJLDiaz:

введите описание изображения здесь

\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} 

решение2

С огромной помощью @Ñako,вот окончательный результат.

AlCoCrFeNi сплав с высокой энтропией

% 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}

Связанный контент