Tikz 곡선과 무작위 변형 결합

Tikz 곡선과 무작위 변형 결합

\draw경로를 따라 임의의 변형으로 정의된 곡선을 결합하고 싶습니다 .

지금까지 나는 tex.SE에 관해 다음과 같은 흥미로운 토론을 발견했습니다.tikz/pgf에서 브라운 운동을 그리는 방법,비머 프레임에서 tikz를 사용하여 "rand" 함수에 의해 생성된 브라운 운동의 궤적을 수정하는 방법, 그리고 (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명령은 내가 얻으려는 결과를 생성하지 않습니다. 심지어 빨간색 선에도 x 방향의 약 75% 지점에서 "hickup"이 있습니다.

tikz 매뉴얼에 따르면 그 이유는 다음과 같습니다.각 단계의 끝은 간격 [-d,d]에서 균일하게 추출된 두 값에 의해 x 방향과 y 방향 모두에서 교란됩니다. 여기서 d는 진폭 값입니다.이는 y 값만 변경하면 원하는 출력을 제공하는 곡선 옵션과 충돌합니다. 플롯은 시간에 따른 값의 변화를 설명하므로 음의 x 방향으로 회전하지 않을 수 있습니다.

random stepsx 값만 조작하고 y 값은 조작하지 않도록 장식을 제한하는 방법이 있습니까 ? 대안은 브라운 운동과 같이 이산적인 간격으로 무작위 왜곡으로 곡선을 오버레이하는 것입니다.

결과가 어떻게든 안정적이기를 바라면서(이는 임의 이동 개념과 충돌합니다. ㅋㅋㅋ) 실제로 시드를 제어할 필요는 없습니다...

답변1

이것은 질문에 대한 대답입니다. y 방향으로 임의의 단계를 가질 수 있습니까? 대답은 '예'입니다. 해야 할 일은 무작위 단계의 정의를 복사하고 이동을 x0으로 설정하는 것뿐입니다.

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

여기에 이미지 설명을 입력하세요

이것은 확실히 경로를 통해 부드러운 무작위 곡선을 그리는 첫 번째 게시물이 아닙니다. 다음을 포함하여 여러 이전 게시물이 있습니다.이 하나,이 하나,에 대한 답변이 질문그리고 그에 대한 답변이 질문.

관련 정보