我正在研究随机游走,我想创建一个一维图像。下面是一个二维游走的相当不错的图像:在 TikZ 中绘制随机路径(尽管出于某种原因它不会每次都重新计算 - 但这并不重要)。但我不知道如何为 1 维创建一个。
我希望它看起来像这样:
到目前为止我已经尝试过:
\pgfmathsetseed{1}
\begin{tikzpicture}[x=6pt,y=6pt,baseline,scale=1,rotate=45]
\coordinate (current point) at (0,0);
\coordinate (old velocity) at (0,0);
\coordinate (new velocity) at (0.5,rand);
\foreach \i in {0,1,...,20}
{
\draw (current point)
.. controls ++([scale=0.2]old velocity) and ++(new velocity) .. ++(0.5,rand)
coordinate (current point);
\coordinate (old velocity) at (new velocity);
\coordinate (new velocity) at (0.5,rand);
}
\end{tikzpicture}
答案1
答案2
由于您有点担心速度,这里是移植到 Metapost + LuaTeX 的 Mark Wilbrow 解决方案(我使用 ConTeXt,但您也可以使用与 LuaLaTeX + mplib 类似的解决方案)。
\setupMPpage[instance=doublefun]
\starttext
\dorecurse{3}{
\startMPpage
ux := 0.5pt;
uy := 2pt;
vardef jump = 2*(uniformdeviate 1) - 1 enddef;
path p;
z[0] = origin;
p := z[0] for i = 1 upto 1000 :
hide(z[i] = z[i-1] + (ux, jump*uy);) -- z[i]
endfor;
draw p ;
\stopMPpage}
\stoptext
该instance=doublefun
行告诉 metapost 使用双精度(而不是通常的缩放精度。我画了三条线以便与 TikZ 进行公平的速度比较。
在我的 2013 款 Macbook 上,我得到以下时间:
对于 Mark Wibrow 的 Tikz 解决方案:
$time pdflatex --interaction=batchmode rand-ltx.tex 2.45s user 0.02s system 99% cpu 2.491 total
对于上述luatex + metapost(ConTeXT)解决方案:
$time contextjit rand-c --once --noconsole 0.77s user 0.08s system 97% cpu 0.867 total
因此 metapost 大约快 3 倍(可能更多,因为 luatex + opentype 字体的加载时间比 pdftex 的加载时间大得多)。
您还可以尝试不同类型的线路连接,看看哪种结果更好(我正在尝试--
,.. tension 2 ..
和`..张力 3')。
\setupMPpage[instance=doublefun]
\starttext
\setvalue{line:1}{--}
\setvalue{line:2}{.. tension 2 ..}
\setvalue{line:3}{.. tension 3 ..}
\startTEXpage
\dorecurse{3}
{\startMPcode
randomseed := 42;
ux := 1pt;
uy := 4pt;
vardef jump = 2*(uniformdeviate 1) - 1 enddef;
path p;
z[0] = origin;
p := z[0] for i = 1 upto 100 :
hide(z[i] = z[i-1] + (ux, jump*uy);) \getvalue{line:\recurselevel} z[i]
endfor;
draw p ;
\stopMPcode
\endgraf}
\stopTEXpage
\stoptext
这使
第二条曲线和第三条曲线之间存在细微的差别。