如何在随机位置(在x
和y
方向上随机间隔)绘制如下所示的圆形路径?
梅威瑟:
\documentclass[border = 0.12cm,tikz]{standalone}
\usetikzlibrary{decorations.pathmorphing,snakes}
\usepackage{amsmath}
\begin{document}
\begin{tikzpicture}[x = 4.5in, y = 2in]
\fill [blue!20] (0,0) -- (1,0) -- (1,0.5) -- (0,0.5) -- cycle;
\foreach \x in {0.05,0.075,0.25,0.35,0.45,0.55,0.65,0.85}
\draw [>=stealth,->] (\x,0.1) arc (280:0:.1cm) -- +(283:0.05cm);
\end{tikzpicture}
\end{document}
答案1
您可以使用泊松圆盘采样库(您可以在这个答案)。
您需要将该答案的内容复制/粘贴到具有这些名称的两个文件中。您还需要一个poisson.sty
编译工作。poisson.lua
lualatex
然后,使用它,您可以编译以下代码(这一个需要 PGF=>3.0,稍后请参阅与 PGF<3.0 一起使用的其他示例)
\documentclass{article}
\usepackage{tikz}
\usepackage{poisson}
\begin{document}
\edef\mylist{\poissonpointslist{5}{5}{0.5}{20}}
\tikzset{
circular arrow/.pic={
\draw [>=stealth,->] (0,0.1) arc (280:0:.1cm) -- +(283:0.05cm);
}
}
\begin{tikzpicture}
\foreach \x/\y in \mylist {
\path (\x,\y) pic {circular arrow};
}
\end{tikzpicture}
\end{document}
该行\edef\mylist{\poissonpointslist{5}{5}{0.5}{20}}
用于创建放置每个图片的随机坐标。您可以更改参数:前两个参数是放置坐标的矩形的宽度和高度。第三个参数(0.5)是随机坐标之间允许的最小距离。最后一个参数(20)由算法内部使用,并在速度和结果之间进行权衡,通常将其设置为 15 或 30 之间的值。
这是另一个例子,其中箭头更密集,并且不使用pic
(因此它使用 PGF<3.0 进行编译,但仍然需要 lualatex)
\documentclass{article}
\usepackage{tikz}
\usepackage{poisson}
\begin{document}
\edef\mylist{\poissonpointslist{5}{5}{0.25}{20}}
\begin{tikzpicture}
\foreach \x/\y in \mylist {
\draw[>=stealth, ->] (\x,\y) arc (280:0:.1cm) -- +(283:0.05cm);
}
\end{tikzpicture}
\end{document}
结果:
更新
x
为了创建您在示例中提供的矩形,我将在和中使用相同的比例y
,以强制中心均匀分布。此外,算法要填充的区域的大小应该比您填充的矩形小一点(因为算法只生成坐标,事先不知道您将在每个坐标处绘制的图片的大小)。因此,例如:
\edef\mylist{\poissonpointslist{4.4}{0.9}{0.2}{20}}
\begin{tikzpicture}[x=1in, y=1in]
\fill[blue!20] (0,0) rectangle (4.5,1);
\foreach \x/\y in \mylist {
\draw[>=stealth, ->] (.02,0.02) +(\x,\y) arc (280:0:.1cm) -- +(283:0.05cm);
}
\end{tikzpicture}
此示例不需要 PGF3.0,并且产生:
答案2
另一种方法是很多速度较慢,并导致很多比 JLDiaz 的泊松抽样结果更不吸引人的结果来自tikz:均匀随机分布圆圈. 唯一的优点是这不需要lualatex
。
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\def\xlist{4}
\def\ylist{4}
\newcommand{\fillrandomly}[4]{
\pgfmathsetmacro\diameter{#3*2}
\draw (0,0) rectangle (#1,#2);
\foreach \i in {1,...,#4}{
\pgfmathsetmacro\x{0.5*#3+rnd*(#1-#3)}
\pgfmathsetmacro\y{0.5*#3+rnd*(#2-#3)}
\xdef\collision{0}
\foreach \element [count=\i] in \xlist{
\pgfmathtruncatemacro\j{\i-1}
\pgfmathsetmacro\checkdistance{ sqrt( ({\xlist}[\j]-(\x))^2 + ({\ylist}[\j]-(\y))^2 ) }
\ifdim\checkdistance pt<\diameter pt
\xdef\collision{1}
\breakforeach
\fi
}
\ifnum\collision=0
\xdef\xlist{\xlist,\x}
\xdef\ylist{\ylist,\y}
\draw [>=stealth,->] (\x,\y) ++(280:#3) arc (280:0:#3) -- +(283:0.05cm);
\fi
}
}
\begin{tikzpicture}
\pgfmathsetseed{1}
\fillrandomly{10}{4}{0.1}{50}
\end{tikzpicture}
\end{document}