Combina la curva tikz con variación aleatoria

Combina la curva tikz con variación aleatoria

Me gustaría combinar una curva definida con \drawuna variación aleatoria a lo largo del camino.

Hasta ahora he encontrado algunas discusiones interesantes sobre tex.SE comoCómo dibujar movimientos brownianos en tikz/pgf,Cómo arreglar la trayectoria de los movimientos brownianos generados por la función "rand" con tikz en fotogramas de proyector, y (gracias a Kpym, he supervisado esto)Simulando líneas dibujadas a mano, pero no funcionan como se esperaba.

El uso de decoraciones tikz parece prometedor, pero sólo para curvas relativamente rectas.

El siguiente MWE da este resultado:

ingrese la descripción de la imagen aquí

\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}

El tercer \drawcomando (azul) no produce el resultado que intento obtener; incluso la línea roja tiene un "problema" en aproximadamente el 75% del camino en la dirección x.

Según el manual de tikz el motivo es:El final de cada paso se ve perturbado tanto en la dirección x como en la dirección y por dos valores extraídos uniformemente del intervalo [−d,d], donde d es el valor de la amplitud.Esto entra en conflicto con la opción curva donde variar solo el valor de y debería dar el resultado deseado. Dado que los gráficos describen el cambio de un valor en el tiempo, es posible que no giren hacia la dirección x negativa.

¿Hay alguna forma de restringir la random stepsdecoración para manipular solo el valor de x pero no el de y? La alternativa sería superponer una curva mediante una distorsión aleatoria a intervalos discretos como los movimientos brownianos...

Con la esperanza de que los resultados sean de alguna manera estables (lo que entra en conflicto con la idea de cambios aleatorios, jajaja), no hay una necesidad real de controlar las semillas...

Respuesta1

Esta es una respuesta a la pregunta: ¿se pueden tener pasos aleatorios en la dirección y? La respuesta es sí, todo lo que hay que hacer es copiar la definición de pasos aleatorios y establecer el xdesplazamiento en cero.

\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}

ingrese la descripción de la imagen aquí

Por supuesto, se puede dibujar una curva aleatoria suave. En este punto, esto debe realizarse en dos pasos.

  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}

ingrese la descripción de la imagen aquí

Tenga en cuenta que esta no es ciertamente la primera publicación que dibuja una curva aleatoria suave a través de un camino; hay varias publicaciones anteriores, incluidaÉste,Éste, las respuestas aesta preguntay las respuestas aesta pregunta.

información relacionada