Объединить кривую tikz со случайной вариацией

Объединить кривую tikz со случайной вариацией

Я хотел бы объединить кривую, заданную с помощью, \drawсо случайным изменением вдоль пути.

Пока что я нашел несколько интересных обсуждений на tex.SE, например:Как нарисовать броуновское движение в tikz/pgf,Как исправить траекторию броуновского движения, сгенерированную функцией «rand» с tikz в системах проецирования, и (спасибо Kpym, я это контролировал)Имитация нарисованных от руки линий, но они не работают так, как ожидалось.

Использование tikz-декораций выглядит многообещающе, но только для относительно прямых изгибов.

Следующий MWE дает такой результат:

введите описание изображения здесь

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

Третья (синяя) \drawкоманда дает не тот результат, который я пытаюсь получить — даже красная линия имеет «затык» примерно на 75% пути по оси x.

Согласно tikz-manual, причина в следующем:Конец каждого шага возмущен как в направлении x, так и в направлении y двумя значениями, равномерно взятыми из интервала [−d,d], где d — значение амплитуды.Это противоречит варианту с кривой, где изменение только значения y должно давать желаемый результат. Поскольку графики описывают изменение значения во времени, они не могут поворачиваться в сторону отрицательного направления x.

Есть ли способ ограничить random stepsдекорирование, чтобы манипулировать только значением x, но не y? Альтернативой было бы наложение кривой случайным искажением на дискретных интервалах, как броуновское движение...

Если надеяться, что результаты будут хоть как-то стабильны (что противоречит идее случайных сдвигов - ха-ха), то нет никакой реальной необходимости контролировать семена...

решение1

Это ответ на вопрос: могут ли быть случайные шаги в направлении y? Ответ — да, все, что нужно сделать, это скопировать определение случайных шагов и установить сдвиг xна ноль.

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

введите описание изображения здесь

Конечно, можно нарисовать гладкую случайную кривую. На данном этапе это должно происходить в два этапа.

  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}

введите описание изображения здесь

Обратите внимание, что это, конечно, не первый пост, в котором рисуется гладкая случайная кривая через путь, есть несколько более ранних постов, включаяВот этот,Вот этот, ответы наэтот вопроси ответы наэтот вопрос.

Связанный контент