Kombinieren Sie die Tikz-Kurve mit zufälligen Variationen

Kombinieren Sie die Tikz-Kurve mit zufälligen Variationen

Ich möchte eine mit definierte Kurve \drawmit einer zufälligen Variation entlang des Pfades kombinieren.

Bisher habe ich einige interessante Diskussionen auf tex.SE gefunden, wieSo zeichnen Sie Brownsche Bewegungen in Tikz/PGF,So beheben Sie die Flugbahn der Brownschen Bewegungen, die durch die Funktion „rand“ mit Tikz in Beamer-Frames generiert werden, und (danke an Kpym, ich habe das überwacht)Simulieren von handgezeichneten Linien, aber sie funktionieren nicht wie erwartet.

Die Verwendung von Tikz-Dekorationen sieht vielversprechend aus, aber nur für relativ gerade Kurven.

Das folgende MWE liefert dieses Ergebnis:

Bildbeschreibung hier eingeben

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

Der dritte (blaue) \drawBefehl erzeugt nicht das Ergebnis, das ich erreichen möchte – selbst die rote Linie weist bei etwa 75 % des Weges in x-Richtung einen „Schluckauf“ auf.

Laut Tikz-Handbuch ist der Grund:Das Ende jedes Schrittes wird sowohl in x- als auch in y-Richtung durch zwei Werte gestört, die gleichmäßig aus dem Intervall [−d,d] gezogen werden, wobei d der Amplitudenwert ist.Dies steht im Widerspruch zur gekrümmten Option, bei der nur die Variation des y-Werts das gewünschte Ergebnis liefern sollte. Da die Diagramme die Änderung eines Werts im Laufe der Zeit beschreiben, dürfen sie sich nicht in die negative x-Richtung drehen.

Gibt es eine Möglichkeit, die Dekoration so einzuschränken, random stepsdass nur der x-Wert, nicht aber der y-Wert manipuliert wird? Die Alternative wäre, eine Kurve in diskreten Intervallen wie bei Brownschen Bewegungen mit einer zufälligen Verzerrung zu überlagern ...

Ich hoffe, dass die Ergebnisse einigermaßen stabil sind (was im Widerspruch zur Idee zufälliger Verschiebungen steht – lol), es besteht keine wirkliche Notwendigkeit, die Samen zu kontrollieren …

Antwort1

Dies ist eine Antwort auf die Frage: Kann man in y-Richtung zufällige Schritte haben? Die Antwort ist ja. Man muss lediglich die Definition der zufälligen Schritte kopieren und die xVerschiebung auf Null setzen.

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

Bildbeschreibung hier eingeben

Natürlich kann man auch eine glatte Zufallskurve zeichnen. An dieser Stelle muss das aber in zwei Schritten geschehen.

  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}

Bildbeschreibung hier eingeben

Beachten Sie, dass dies sicherlich nicht der erste Beitrag ist, der eine glatte, zufällige Kurve durch einen Pfad zeichnet. Es gibt mehrere frühere Beiträge, darunterDieses hier,Dieses hier, die Antworten aufdiese Frageund die Antworten aufdiese Frage.

verwandte Informationen