재현하려고 하는데이 그림~의고엔트로피 합금(HEA) TikZ:
색상 목록 중 하나를 무작위로 할당하는 방법을 찾을 수 없기 때문에 지금까지 제가 가지고 있는 것은 매우 단조로워 보입니다.
\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}
그건 그렇고,에 대한 답변은Tikz에서 분자층을 사용하여 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님의 큰 도움으로여기 최종 결과가 있습니다.
% 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}