代码

代码

我又想重现一些奇怪的图像。我试图用三种颜色生成不间断的六边形。这三种颜色的分布应该是

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),然后在1n_tot=3*N*(N+1)+1之间、1n_tot=3*N*(N+1)之间等选择一个随机数,其中每一步都会取出一个颜色项,因此三个计数器nonentwonthree。在每一步中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}

在此处输入图片描述

相关内容