¿Hay alguna manera de dibujar algo como esto?
En tikz, sin ser demasiado errático comoDibujar caminos aleatorios en TikZ?
Respuesta1
Dado que no parece requerir que las curvas sean suaves (como¿Cómo dibujar curvas aleatorias, simples, cerradas, suaves pero con el mismo perímetro?lo hace), puede intentar ajustar los parámetros de decoration=penciline
o \freedraw
:
Referencias:
decoration=penciline
es desdeSimulando líneas dibujadas a mano: percusiónfreedraw
es desdeSimulando líneas dibujadas a mano: Alain Matthes
Código:
\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}
Respuesta2
Aquí hay unfractalsolución conlineas suaves.
Ejemplo con dos círculos y dos triángulos:
El código:
\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}
Respuesta3
Aquí está mi contribución:
\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}