
Gostaria de combinar uma curva definida com \draw
uma variação aleatória ao longo do caminho.
Até agora encontrei algumas discussões interessantes sobre tex.SE comoComo desenhar movimentos brownianos em tikz/pgf,Como corrigir a trajetória dos movimentos brownianos gerados pela função "rand" com tikz em frames do beamer, e (graças ao Kpym, eu supervisionei isso)Simulando linhas desenhadas à mão, mas eles não funcionam conforme o esperado.
Usar decorações tikz parece promissor, mas apenas para curvas relativamente retas.
O seguinte MWE dá este resultado:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{decorations.pathmorphing}
\begin{document}
\begin{tikzpicture}[x=5mm,y=5mm,decoration={random steps,segment length=3mm,amplitude=1mm}]
\draw[thick,green] (0, 1) -- (14.5, 1);
\draw[thick,red,decorate,rounded corners] (0,-0.5) -- (14.5,-0.5);
\draw[thick,blue,decorate,rounded corners] (0, 0.5) -- (1,0.5) -- (1.5,-4) -- (2,-3.5) -- (3.5,-2) -- (14.5, 0);
\end{tikzpicture}
\end{document}
O terceiro \draw
comando (azul) não produz o resultado que tento obter - até mesmo a linha vermelha tem um "soluço" em cerca de 75% do caminho na direção x.
De acordo com o manual do tikz, o motivo é:O final de cada etapa é perturbado tanto na direção x quanto na direção y por dois valores extraídos uniformemente do intervalo [−d,d], onde d é o valor da amplitude.Isso entra em conflito com a opção curva, onde a variação apenas do valor y deve fornecer a saída desejada. Como os gráficos descrevem a mudança de um valor no tempo, eles não podem virar na direção negativa de x.
Existe alguma maneira de restringir a random steps
decoração para manipular apenas o valor x, mas não y? A alternativa seria sobrepor uma curva por uma distorção aleatória em intervalos discretos, como movimentos brownianos...
Esperando que os resultados sejam de alguma forma estáveis (o que entra em conflito com a ideia de mudanças aleatórias - haha), não há necessidade real de controlar as sementes...
Responder1
Esta é uma resposta à pergunta: é possível dar passos aleatórios na direção y? A resposta é sim, tudo o que precisamos fazer é copiar a definição de etapas aleatórias e definir o x
deslocamento para zero.
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{decorations.pathmorphing}
\pgfdeclaredecoration{random y steps}{start}
{%
\state{start}[width=+0pt,next state=step,persistent precomputation=\pgfdecoratepathhascornerstrue]{}%
\state{step}[auto end on length=1.5\pgfdecorationsegmentlength,
auto corner on length=1.5\pgfdecorationsegmentlength,
width=+\pgfdecorationsegmentlength]
{
\pgfpathlineto{
\pgfpointadd
{\pgfpoint{\pgfdecorationsegmentlength}{0pt}}
{\pgfpoint{0pt}{rand*\pgfdecorationsegmentamplitude}}
}
}%
\state{final}
{}%
}%
\begin{document}
\begin{tikzpicture}[x=5mm,y=5mm,decoration={random y steps,segment length=3mm,amplitude=1mm}]
\draw[thick,green] (0, 1) -- (14.5, 1);
\draw[thick,red,decorate,rounded corners] (0,-0.5) -- (14.5,-0.5);
\draw[thick,blue,decorate,rounded corners] (0, 0.5) -- (1,0.5) -- (1.5,-4) -- (2,-3.5) -- (3.5,-2) -- (14.5, 0);
\end{tikzpicture}
\end{document}
É claro que se pode desenhar uma curva aleatória suave. Neste ponto, isso deve ocorrer em duas etapas.
\path[decorate] <path>;
\draw[<options>] plot[variable=\x,samples at={1,...,\arabic{randymark}},smooth] (randymark\x);
\documentclass[tikz,border=3.14mm]{standalone}
\usetikzlibrary{decorations.pathmorphing}
\newcounter{randymark}
\pgfdeclaredecoration{mark random y steps}{start}
{%
\state{start}[width=+0pt,next state=step,%
persistent precomputation={\pgfdecoratepathhascornerstrue%
\setcounter{randymark}{0}}]{
\stepcounter{randymark}
\pgfcoordinate{randymark\arabic{randymark}}{\pgfpoint{0pt}{0pt}}
}%
\state{step}[auto end on length=1.5\pgfdecorationsegmentlength,
auto corner on length=1.5\pgfdecorationsegmentlength,
width=+\pgfdecorationsegmentlength]
{ \stepcounter{randymark}
\pgfcoordinate{randymark\arabic{randymark}}{\pgfpoint{\pgfdecorationsegmentlength}{rand*\pgfdecorationsegmentamplitude}}
}%
\state{final}
{
\stepcounter{randymark}
\pgfcoordinate{randymark\arabic{randymark}}{\pgfpointdecoratedpathlast}}%
}%
\begin{document}
\begin{tikzpicture}[x=5mm,y=5mm,decoration={mark random y steps,segment length=3mm,amplitude=1mm}]
\path[decorate] (0,-0.5) -- (14.5,-0.5);
\draw[red,thick] plot[variable=\x,samples at={1,...,\arabic{randymark}},smooth]
(randymark\x);
\path[decorate] (0, 0.5) -- (1,0.5) -- (1.5,-4) -- (2,-3.5) -- (3.5,-2) -- (14.5, 0);
\draw[blue,thick] plot[variable=\x,samples at={1,...,\arabic{randymark}},smooth]
(randymark\x);
\path[decorate] (4,4) circle(3cm);
\draw[orange,thick] plot[variable=\x,samples at={1,...,\arabic{randymark}},smooth]
(randymark\x);
\end{tikzpicture}
\end{document}
Observe que este certamente não é o primeiro post que desenha uma curva suave e aleatória através de um caminho, existem vários posts anteriores, incluindoEste,Este, as respostas paraessa questãoe as respostas paraessa questão.