Combine a curva tikz com variação aleatória

Combine a curva tikz com variação aleatória

Gostaria de combinar uma curva definida com \drawuma 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:

insira a descrição da imagem aqui

\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 \drawcomando (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 stepsdecoraçã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 xdeslocamento 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}

insira a descrição da imagem aqui

É claro que se pode desenhar uma curva aleatória suave. Neste ponto, isso deve ocorrer em duas etapas.

  1. \path[decorate] <path>;
  2. \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}

insira a descrição da imagem aqui

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.

informação relacionada