更新:使用泊松采样

更新:使用泊松采样

我正在尝试创建下面的插图。

随机填充的形状

使用 Tikz,我成功实现了如下所示的部分效果(请忽略尺寸不匹配)。 尚未出现随机图案

到目前为止我使用的代码(MWE)如下:

\documentclass[tikz,border=5mm]{standalone}
\usetikzlibrary{positioning}

\begin{document}
\begin{tikzpicture}[every node/.style={draw,thin,minimum height=10mm}]

    \node [fill=orange]                                 (boxA) {};
    \node [text width=10mm,anchor=west]  at (boxA.east) (boxB)   {};
    \node [anchor=west]                  at (boxB.east) (boxC)   {};
    \node [text width=10mm,anchor=west]  at (boxC.east) (boxD)   {};
    \node [fill=black!30,anchor=west]    at (boxD.east) (boxE)   {};

\end{tikzpicture}
\end{document}

我希望有人能帮我生成每个部分中的随机形状(光滑、封闭的 2D 胶囊)。我真的需要使用“节点”来实现这一点,也就是说,需要使用节点创建基本结构,而不是使用“矩形”和“坐标”手绘。

我已将不同的节点命名为“boxA”到“boxE”。任何帮助都非常感谢。PSTricks 代码不够好,因为我的其余插图(周围的基础设施、相对位置等)都是用 TikZ 编码的。

答案1

每一个“斑点”都可以用以下技术绘制:这个答案,但经过修改后可以使用 Hobby 包来产生更平滑的结果。

在下一个示例中,我定义了一个,pic它绘制了这些“斑点”之一。由于一个,因此pic很容易旋转、缩放和平移形状,因此我在一个规则网格中绘制了 35 个。除了规则网格,您还可以使用由一个生成的随机位置泊松圆盘采样

这是我的最小示例代码:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{hobby}
\usetikzlibrary{calc}
\begin{document}

\tikzset{
 pics/blob/.style={
   code={
   \draw[use Hobby shortcut, fill, closed] (0,0) +($(0:1+4*rnd)$)
       \foreach \a in {60,120,...,350} {  .. +($(\a: 1+4*rnd)$) };
   }
}}
\begin{tikzpicture}
  \foreach \x in {0,...,5} {
    \foreach \y in {0,...,7} {
      \pgfmathsetmacro{\scale}{0.1+0.1*rnd}
      \pic at (\x,\y)  [fill=green!30, scale=\scale, rotate=360*rnd]{blob};
    }
  };
\end{tikzpicture}
\end{document}

结果如下:

结果

更新:使用泊松采样

使用来自的 lua 代码这个答案生成每个 blob 的 (x,y)。其余代码相同。这是完整的主 tex 文件:

\documentclass{article}
\usepackage{tikz}
\usepackage{poisson}
\usetikzlibrary{hobby}
\usetikzlibrary{calc}

\tikzset{
 pics/blob/.style={
   code={
   \draw[use Hobby shortcut, fill, closed] (0,0) +($(0:1+4*rnd)$)
       \foreach \a in {60,120,...,350} {  .. +($(\a: 1+4*rnd)$) };
   }
}}

\begin{document}
\edef\mylist{\poissonpointslist{5}{5}{0.4}{15}}
\begin{tikzpicture}
     \foreach \x/\y in \mylist {
       \pgfmathsetmacro{\scale}{0.02+0.1*rnd}
        \pic at (\x,\y)  [fill=green!30, scale=0.1, rotate=360*rnd]{blob};
     }
\end{tikzpicture}
\end{document}

结果如下:

结果

要编译它,您必须使用 Lualatex(需要一段时间才能完成)。

最后更新

此版本使用 OP 问题中的代码,然后使用我的代码填充其节点。有必要调整斑点的比例,因为要填充的区域非常小,并且出于同样的原因调整斑点的线宽。此外,还inner sep=0pt添加到 OP 的节点,以完全控制它们的宽度和高度。

最后,由于 OP 提供的图中两个框都填充了完全相同的形状,但颜色不同,因此我修复了一个随机种子并在填充第二个框之前将其恢复。

代码:

\documentclass{article}
\usepackage{tikz}
\usepackage{poisson}
\usetikzlibrary{hobby}
\usetikzlibrary{calc}
\usetikzlibrary{positioning}

\tikzset{
 pics/blob/.style={
   code={
   \draw[use Hobby shortcut, fill, closed] (0,0) +($(0:1+4*rnd)$)
       \foreach \a in {60,120,...,350} {  .. +($(\a: 1+4*rnd)$) };
   }
}}
\newcounter{mathseed}
\setcounter{mathseed}{3}

\begin{document}
\edef\mylist{\poissonpointslist{1}{.9}{0.06}{10}}
\begin{tikzpicture}[every node/.style={draw,thin,minimum height=10mm,inner sep=0pt}]

    \node [fill=orange,text width=2mm]                                (boxA) {};
    \node [text width=11mm,anchor=west]                at (boxA.east) (boxB) {};
    \node [anchor=west, text width=2mm]                at (boxB.east) (boxC) {};
    \node [text width=11mm,anchor=west]                at (boxC.east) (boxD) {};
    \node [fill=black!30,anchor=west, text width=2mm]  at (boxD.east) (boxE) {};
    \pgfmathsetseed{\arabic{mathseed}}
     \foreach \x/\y in \mylist {
       \pgfmathsetmacro{\scale}{0.01+0.01*rnd}
        \pic at ($(boxB.south west)+(\x+.06,\y+.05)$)
            [line width=0.05mm,fill=green!80!black, 
             scale=\scale, rotate=360*rnd]{blob};
    }
    \pgfmathsetseed{\arabic{mathseed}}
     \foreach \x/\y in \mylist {
       \pgfmathsetmacro{\scale}{0.01+0.01*rnd}
        \pic at ($(boxD.south west)+(\x+.06,\y+.05)$)
            [line width=0.05mm,fill=magenta!80!black, 
             scale=\scale, rotate=360*rnd]{blob};
    }
\end{tikzpicture}
\end{document}

结果:

结果

相关内容