我又想重现一些奇怪的图像。我试图用三种颜色生成不间断的六边形。这三种颜色的分布应该是
Color 1 = (N-1)^2
Color 2 = (N-1)*N
Color 3 = N^2
其中 N 是非停止点的边长。结果应该看起来像这样。
笔记:这里用了 4 种颜色,但我只需要 3 种!其次,上图中的分布本身就是错误的。
然后我们的想法是“排序”不间断,以制作下面的图
我能够创建六边形不间断图案(经过大量工作!),如下所示。
我想改进的是这个
- 我如何才能精确控制六边形中每种颜色的数量。我仍然希望它们随机出现在六边形中。
- 如果外观上能有任何改进,让其看起来更像真正的糖果,我们将非常感激。
- 有没有更简单的方法来生成六边形?我不得不做大量的数学运算,反复试验才能得到正确的结果。(另外,为什么我的行之间有一个小间隙?)。
非常感谢任何其他可以获得结果的方法。
代码
\documentclass[12pt]{article}
\usepackage{ifthen, tikz}
\pgfmathsetseed{\number\pdfrandomseed}
\usetikzlibrary{shapes.geometric}
\definecolor{maincolorMedium}{HTML}{425b9b}
\tikzset{
nonstop/.style={
circle,
minimum size=10mm,
inner sep=0mm,
outer sep=0mm,
rotate=0,
draw
}
}
\definecolor{nonstopRed}{HTML}{EB4F5C}
\definecolor{nonstopYellow}{HTML}{FFE103}
\definecolor{nonstopBlack}{HTML}{02031B}
\newcommand{\ballcolor}{none}
% Example: Pick color by ID
\newcommand{\incolor}{
\pgfmathsetmacro{\rng}{int(random(1,3))}
\ifthenelse{\rng < 2}{ \renewcommand{\ballcolor}{nonstopRed}}{%
\ifthenelse{\rng < 3}{ \renewcommand{\ballcolor}{nonstopYellow} }{%
\renewcommand{\ballcolor}{nonstopBlack}
}
}
}
\newcommand{\createNonstop}[1]{%
\begin{tikzpicture}
\def\hexagonSize{#1}
\pgfmathsetmacro{\J}{2*\hexagonSize-1}
\foreach \j in {1,...,\J} {
\pgfmathsetmacro{\offset}{0.5*Mod(\j,2)}
\ifthenelse{\j > \hexagonSize}
{\pgfmathsetmacro{\hexLength}{\hexagonSize + \J - \j}
\pgfmathsetmacro{\jIndent}{0.5*(\J - \j)}}
{\pgfmathsetmacro{\hexLength}{\hexagonSize + \j-1}
\pgfmathsetmacro{\jIndent}{0.5*(\j-1)}}
\foreach \k in {1,...,\hexLength} {
\incolor
\node[nonstop,fill=\ballcolor] at (\k -\jIndent,\j) {};
}
}
\end{tikzpicture}
}
\begin{document}
\createNonstop{2}
\createNonstop{3}
\createNonstop{4}
\createNonstop{5}
\end{document}
答案1
抱歉,我之前的帖子没有包括对颜色数量的要求,现在我已更正。此代码循环执行一系列3*N*(N+1)+1
步骤(请注意,我对 的定义N
是您的N+1
),然后在1
和n_tot=3*N*(N+1)+1
之间、1
和n_tot=3*N*(N+1)
之间等选择一个随机数,其中每一步都会取出一个颜色项,因此三个计数器none
、ntwo
和nthree
。在每一步中none+ntwo+nthree=n_tot
,每个颜色堆的计数器都会减少。这确保了将有(N+1)^2
第一种颜色、N*(N+1)
第二种颜色和N^2
最后一种颜色的聪明豆。格子只是一层一层地构建的。
\documentclass[tikz,border=3.14mm]{standalone}
\usetikzlibrary{shadows.blur}
\newcounter{none}
\newcounter{ntwo}
\newcounter{nthree}
\begin{document}
\begin{tikzpicture}[pics/hegrid/.style={code={
\xdef\LstOne{""}
\setcounter{none}{\the\numexpr(#1+1)*(#1+1)}
\setcounter{ntwo}{\the\numexpr#1*(#1+1)}
\setcounter{nthree}{\the\numexpr#1*#1}
\pgfmathtruncatemacro{\Nm}{int(3*#1*(#1+1)+1)}
\foreach \YY in {\Nm,\the\numexpr\Nm-1,...,1}
{\pgfmathtruncatemacro{\itest}{random(1,\YY)}
\ifnum\itest>\number\value{none}\relax
\ifnum\itest>\the\numexpr\YY-\number\value{nthree}\relax
\addtocounter{nthree}{-1}
\pgfmathsetmacro{\mycol}{{\LstCols}[2]}
\xdef\LstOne{\LstOne,"\mycol"}
\else
\addtocounter{ntwo}{-1}
\pgfmathsetmacro{\mycol}{{\LstCols}[1]}
\xdef\LstOne{\LstOne,"\mycol"}
\fi
\else
\addtocounter{none}{-1}
\pgfmathsetmacro{\mycol}{{\LstCols}[0]}
\xdef\LstOne{\LstOne,"\mycol"}
\fi}
\setcounter{none}{1}
\path [/utils/exec=\pgfmathsetmacro{\mycol}{{\LstOne}[1]}]
node[smartie=\mycol]{};
\foreach \XX in {1,...,#1}
{\foreach \YY [count=\NYY] in {0,...,5}
{\path (\NYY*60:\XX) -- (\YY*60:\XX) foreach \ZZ in {1,...,\XX}
{\pgfextra{\stepcounter{none}%
\pgfmathsetmacro{\mycol}{{\LstOne}[\number\value{none}]}}
node[smartie=\mycol,pos={\ZZ/\XX}]{}};}}}},
smartie/.style={circle,draw,inner sep=3mm,blur shadow,
path picture={\shade[ball color=#1] (0.15,-0.15) circle[radius=9mm];}}]
\edef\LstCols{"red","blue","green!70!black"}
\path (0,0) pic{hegrid=1} (5,0) pic{hegrid=2}
(2,-6) pic{hegrid=3};
\end{tikzpicture}
\end{document}
有序模式更容易获得。
\documentclass[tikz,border=3.14mm]{standalone}
\usetikzlibrary{shadows.blur}
\begin{document}
\begin{tikzpicture}[pics/ordered hegrid/.style={code={
\path [/utils/exec=\pgfmathsetmacro{\mycol}{{\LstCols}[0]}]
node[smartie=\mycol]{};
\foreach \XX in {1,...,#1}
{\foreach \YY [count=\NYY] in {0,...,5}
{\path (\NYY*60+60:\XX) -- (\YY*60+60:\XX) foreach \ZZ in {1,...,\XX}
{\pgfextra{%
\pgfmathtruncatemacro{\myind}{ifthenelse(\NYY<3 || (\NYY==3 && \ZZ == \XX),0,ifthenelse(\NYY<5,1,2))}
\pgfmathsetmacro{\mycol}{{\LstCols}[\myind]}}
node[smartie=\mycol,pos={\ZZ/\XX}]{}};}}}},
smartie/.style={circle,draw,inner sep=3mm,blur shadow,
path picture={\shade[ball color=#1] (0.15,-0.15) circle[radius=9mm];}}]
\edef\LstCols{"red","blue","green!70!black"}
\path (0,0) pic{ordered hegrid=1} (5,0) pic{ordered hegrid=2}
(2,-6) pic{ordered hegrid=3};
\end{tikzpicture}
\end{document}