Zufällige, nicht fehlerhafte Domäne in Tikz

Zufällige, nicht fehlerhafte Domäne in Tikz

Gibt es eine Möglichkeit, so etwas zu zeichnen?

Bildbeschreibung hier eingeben

In tikz, ohne übermäßig unberechenbar zu sein wieZeichnen von zufälligen Pfaden in TikZ?

Antwort1

Da Sie anscheinend nicht verlangen, dass die Kurven glatt sind (wieWie zeichnet man zufällige, einfache, geschlossene, glatte Kurven mit demselben Umfang?wenn dies der Fall ist), können Sie versuchen, die Parameter von decoration=pencilineoder anzupassen \freedraw:

Bildbeschreibung hier eingeben

Verweise:

Code:

\documentclass{article}
\pagestyle{empty}
\usepackage{tikz}
\usetikzlibrary{calc,decorations.pathmorphing,patterns,shapes}

%% https://tex.stackexchange.com/questions/39296/simulating-hand-drawn-lines: percusse
\pgfdeclaredecoration{penciline}{initial}{
    \state{initial}[width=+\pgfdecoratedinputsegmentremainingdistance,auto corner on length=1mm,]{
        \pgfpathcurveto%
        {% From
            \pgfqpoint{\pgfdecoratedinputsegmentremainingdistance}
                            {\pgfdecorationsegmentamplitude}
        }
        {%  Control 1
        \pgfmathrand
        \pgfpointadd{\pgfqpoint{\pgfdecoratedinputsegmentremainingdistance}{0pt}}
                        {\pgfqpoint{-\pgfdecorationsegmentaspect\pgfdecoratedinputsegmentremainingdistance}%
                                        {\pgfmathresult\pgfdecorationsegmentamplitude}
                        }
        }
        {%TO 
        \pgfpointadd{\pgfpointdecoratedinputsegmentlast}{\pgfpoint{0.5pt}{1.5pt}}
        }
    }
    \state{final}{}
}

%% https://tex.stackexchange.com/questions/39296/simulating-hand-drawn-lines: Alain Matthes
\pgfdeclaredecoration{free hand}{start}
{
  \state{start}[width = +0pt,
                next state=step,
                persistent precomputation = \pgfdecoratepathhascornerstrue]{}
  \state{step}[auto end on length    = 3pt,
               auto corner on length = 3pt,               
               width=+2pt]
  {
    \pgfpathlineto{
      \pgfpointadd
      {\pgfpoint{2pt}{0pt}}
      {\pgfpoint{rand*0.15pt}{rand*0.15pt}}
    }
  }
  \state{final}
  {}
}
 \tikzset{free hand/.style={
    decorate,
    decoration={free hand}
    }
 } 
\def\freedraw#1;{\draw[free hand] #1;}



\begin{document}

\textbf{decoration=penciline}
\par
\begin{tikzpicture}
    \coordinate (A) at (0,0);
    \coordinate (B) at (4,0);
    \coordinate (C) at (7,0);

    \begin{scope}[decoration=penciline,scale=1]
        \draw[thick, fill=blue!25, fill opacity=.25, draw=red, decorate] (A)  rectangle (2,2); 
        \draw[thick, fill=green!25, draw=brown, radius=1cm, decorate] (B)  circle ; 
        \draw[thick, fill=red!20, draw=blue, x radius=1cm, y radius=1.5cm, rotate=30, shape=circle, decorate,] (C) circle ; 
    \end{scope}
\end{tikzpicture}

\textbf{\textbackslash freedraw}
\par
\begin{tikzpicture}
    \coordinate (A) at (0,0);
    \coordinate (B) at (4,0);
    \coordinate (C) at (7,0);

    \freedraw[thick, fill=brown!25,  draw=blue] (A)  rectangle (2,2); 
    \freedraw[thick, fill=violet!25, fill opacity=.25, draw=red] (B) circle [radius=1cm]; 
    \freedraw[thick, fill=orange!25, fill opacity=.25, draw=brown, x radius=0.15cm, y radius=1.5cm, rotate=30, shape=circle,] (C) circle {}; 
\end{tikzpicture}

\end{document}

Antwort2

Hier ist einFraktalLösung mitglatte Linien.

Beispiel mit zwei Kreisen und zwei Dreiecken:

Beispiele für fraktale Deformationen

Der Code:

\documentclass[convert={size=480},margin=1mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{decorations.pathreplacing}
\tikzset{
  fractal lineto/.style n args={2}{%
    % #1 is a ratio of length to move the middle of each segment
    % #2 is the mininum length to apply the recurrence
    to path={
      let
      \p1=(\tikztostart), % start point
      \p2=(\tikztotarget), % end point
      \n1={veclen(\x1-\x2,\y1-\y2)}, % distance 
      \p3=($(\p1)!.5!(\p2)$), % middle point
      \p4=(rand*#1*\n1,rand*#1*\n1), % random vector
      \p5=(\x3+\x4,\y3+\y4) % random moved middle point
      in \pgfextra{
        \pgfmathsetmacro\mytest{(\n1<#2)?1:0}
        \ifnum\mytest=1 %
        \tikzset{fractal lineto/.style n args={2}{line to}}
        \fi
      } to[fractal lineto={#1}{#2}] (\p5) to[fractal lineto={#1}{#2}] (\p2)
    },
  },
  % 
  fractal curveto/.style n args={4}{
    to path={
    %   % #1 is ratio of length to move the middle of each segment
    %   % #2 is the mininum length to apply the recurrence
      let
      \p0=(\tikztostart),
      \p1=(#3),
      \p2=(#4),
      \p3=(\tikztotarget),
      \p4=($(\p0)!.5!(\p1)$),
      \p5=($(\p1)!.5!(\p2)$),
      \p6=($(\p2)!.5!(\p3)$),
      \p7=($(\p4)!.5!(\p5)$),
      \p8=($(\p5)!.5!(\p6)$),
      \p9=($(\p7)!.5!(\p8)$),
      \n1={veclen(\x0-\x0,\y0-\y9)+veclen(\x9-\x3,\y9-\y3)}, % distance 
      \p{rand}=(rand*#1*\n1,rand*#1*\n1), % random vector
      \p{randang}=(rand*#1*\n1,rand*#1*\n1), % random vector
      \p{new9}=(\x9+\x{rand},\y9+\y{rand}), % random moved middle point
      \p{new7}=(\x7+\x{rand},\y7+\y{rand}), % random moved control point
      \p{new8}=(\x8+\x{rand},\y8+\y{rand}) % random moved control point
      in \pgfextra{
        \pgfmathsetmacro\mytest{(\n1<#2)?1:0}
        \ifnum\mytest=1 %
        \tikzset{
          fractal curveto/.style n args={4}{
            curve to,controls=(####3) and (####4)
          }
        }
        \fi
        %\typeout{p9:\p9}
      }
      to[fractal curveto={#1}{#2}{\p4}{\p{new7}}] (\p{new9})
      to[fractal curveto={#1}{#2}{\p{new8}}{\p{6}}] (\p3)
    },
  },
  deformation/.style n args={3}{decorate,decoration={show path construction,
      lineto code={
        \path[#3]
        (\tikzinputsegmentfirst)
        to[fractal lineto={#1}{#2}]
        (\tikzinputsegmentlast);
      },
      curveto code={
        \path[#3]
        (\tikzinputsegmentfirst)
        to[fractal curveto=%
        {#1}{#2}{\tikzinputsegmentsupporta}{\tikzinputsegmentsupportb}]
        (\tikzinputsegmentlast);
      },
      closepath code={
        \path[#3]
        (\tikzinputsegmentfirst)
        to[fractal lineto={#1}{#2}]
        (\tikzinputsegmentlast);
      },
    },
  }
}


\begin{document}
\begin{tikzpicture}
  \pgfmathsetseed{\pdfuniformdeviate 10000000}
  \def\ratio{.1}
  \def\minlen{10mm}
  \begin{scope}
    \draw[deformation={\ratio}{\minlen}{draw=red,line width=1mm}] circle(5cm);
    \draw[deformation={\ratio}{\minlen}{draw=blue,line width=1mm}] circle(5cm);
  \end{scope}

  \begin{scope}
    \draw[deformation={\ratio}{\minlen}{draw=lime,line width=1mm}]
    (0:4) -- (120:4) -- (-120:4) -- cycle;
    \draw[deformation={\ratio}{\minlen}{draw=orange,line width=1mm}]
    (0:4) -- (120:4) -- (-120:4) -- cycle;
  \end{scope}
\end{tikzpicture}
\end{document}

Antwort3

Hier ist mein Beitrag:

\documentclass[border=7mm]{standalone}
\usepackage{tikz}

% create some random points arround 0
% #1 is the number of points
% #2 is the minimal radius
% #3 is the maximal deviation (if =0 no randomness)
\newcommand{\rndpts}[3]{
  \def\pts{}
  \foreach[
    evaluate=\x as \r using {#2+#3*rnd},
    evaluate=\x as \a using {\la+720*rnd/#1},
    remember=\a as \la (initially 0)]
  \x in {0,...,#1}
  {
    \pgfmathparse{int(\a)}
    \ifnum\pgfmathresult > 360\relax
      \breakforeach
    \else
      \xdef\pts{\pts (\a:\r)}
    \fi
  }
}
\begin{document}
  \begin{tikzpicture}
    \foreach \npts/\rmin/\rdelta/\c in {10/1/2/red,20/1/3/green,30/1/4/blue,20/2/3/yellow} {
      \rndpts{\npts}{\rmin}{\rdelta}
      \draw[\c, ultra thick] plot[smooth cycle,tension=.7]  coordinates {\pts};
    }
  \end{tikzpicture}
\end{document}

Bildbeschreibung hier eingeben

verwandte Informationen