我正在尝试创建下面的插图。
使用 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}
结果: