Primeira versão

Primeira versão

Quero criar uma decoração que decorasse um caminho com nuvens cinza transparentes com mudanças aleatórias, número aleatório de baforadas e tamanho de escala. A ideia é que pareça fumaça subindo.

Tentei definir minha própria decoração, tentei usar fundos de formas e marcações, mas nada funcionou. No final consegui desenhar as nuvens em loop, mas claro que não são as soluções mais elegantes. Então este é o código da minha solução e tentativas, e o resultado esperado:

\documentclass[tikz,border=5]{standalone}

\usetikzlibrary{decorations.pathmorphing, decorations.markings, decorations.shapes}
\usetikzlibrary{shapes,calc}

\makeatletter
\newdimen\cloud@sep
\cloud@sep=0.2cm\relax

\pgfdeclaredecoration{smoke}{initial}{
  \state{initial}[width=\cloud@sep]
  {
    \pgfsetfillopacity{0.3}
    \def\tikz@fillcolor{mygray}
    \tikz@mode@filltrue
    \pgfnode{cloud}{center}{}{}{}
    \pgfmathsetlength\cloud@sep{0.2cm + rand*0.2cm}
    \global\cloud@sep=\cloud@sep
  }
  \state{final}
  {
    \pgfpathmoveto{\pgfpointdecoratedpathlast}
  }
}
\makeatother

\begin{document}
\begin{tikzpicture}
  \foreach \i [evaluate={\j=\i-1;}] in {1,2,...,20} {%
    \node[shape=cloud, cloud puffs=9+5*rnd, fill=gray, opacity=0.4, %
    minimum width=4+\j, minimum height=3+0.5*\j] at %
    ($(60:1) + 0.09*(\i,0) + 0.1*(0,\i) + 0.25*(rand,0) + 0.1*(0,rand)$) {}; }
\end{tikzpicture}

%% the code that does not work
\begin{tikzpicture}
  \path[decorate,decoration={smoke, shape start width=1.5mm, shape end
    width=2.5mm, shape start height=2mm, shape end height=3mm},
  decoration={shape scaled}, fill=gray] (60:1.5) -- (50:3);
\end{tikzpicture}

\begin{tikzpicture}
  \path[decorate,decoration={shape backgrounds, shape=cloud, shape
    width=4mm+rand, shape height=3mm+rand}, cloud puffs=11+3*rand, fill=gray,
  opacity=0.3] (60:1.5) -- (50:3);
\end{tikzpicture}
  \end{document}

Fumaça

É possível definir/especificar tal decoração? Observe que seria bom ter uma decoração onde cada nuvem estivesse em um grupo de transparência diferente, ou seja, fosse possível ver suas sobreposições.

Responder1

Primeira versão

Aqui está uma solução possível através de uma markingsdecoração (as nuvens cinzentas estão numa linha e as nuvens laranja estão num círculo):

insira a descrição da imagem aqui

\documentclass[tikz,border=5]{standalone}

\usetikzlibrary{decorations.markings,shapes,calc}

\tikzset{
  random clouds/.style={
    decoration={markings,mark=between positions 0 and 1 step 5mm with {
        \pgfmathsetmacro\myh{5mm+ rnd*1cm}
        \pgfmathsetmacro\myw{\myh + 5mm + rnd*1cm}
        \node[shape=cloud, cloud puffs={10+int(5*rnd)}, fill=#1, opacity=0.4,
        minimum width=\myw,minimum height=\myh]
        at (rand * 1cm,rand * 1cm) {};
      }},
  },
}
\begin{document}
\begin{tikzpicture}
  \path[decorate,random clouds=gray]
  (0,0) -- (10,10);

  \path[decorate,random clouds=red]
  (5,5) circle (3cm);
\end{tikzpicture}
\end{document}

Segunda versão (com fade out)

insira a descrição da imagem aqui

\documentclass[tikz,border=5]{standalone}

\usetikzlibrary{decorations.markings,shapes,calc}

\tikzset{
  random clouds/.style={
    decoration={markings,mark=between positions 0 and 1 step 5mm with {
        \pgfmathsetmacro\myh{15mm + rnd*1cm}
        \pgfmathsetmacro\myw{\myh + 5mm + rnd*1cm}
        \pgfkeysgetvalue{/pgf/decoration/mark info/distance from start}{\currdist}
        \pgfmathsetmacro\myop{1-\currdist/\pgfdecoratedpathlength}
        \node[shape=cloud, cloud puffs={10+int(5*rnd)}, fill=#1, opacity=\myop,
        minimum width=\myw,minimum height=\myh]
        at (rand * 1cm,rand * 1cm) {};
      }},
  },
}
\begin{document}
\begin{tikzpicture}
  \path[decorate,random clouds=orange]
  (0,0) -- (10,10);

\end{tikzpicture}
\end{document}

Terceira versão (com teclas para controlar tamanho e cor)

Nesta versão, os tamanhos das nuvens não são aleatórios.

insira a descrição da imagem aqui

\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{decorations.markings,shapes,calc}

\makeatletter
\tikzset{
  random clouds/.is family,
  random clouds,
  color/.store in=\randomclouds@c,
  start width/.store in=\randomclouds@startw,
  start height/.store in=\randomclouds@starth,
  end width/.store in=\randomclouds@endw,
  end height/.store in=\randomclouds@endh,
  color=gray,
  start width=22mm,start height=12mm,
  end width=14mm,end height=8mm
}
\tikzset{
  random clouds decoration/.style={
    decoration={markings,mark=between positions 0 and 1 step 5mm with {
        \tikzset{random clouds,#1}
        \pgfkeysgetvalue{/pgf/decoration/mark info/distance from start}{\currdist}
        \pgfmathsetmacro\myop{1-\currdist/\pgfdecoratedpathlength}
        \pgfmathsetmacro\myw{\randomclouds@endw+\myop*(\randomclouds@startw-\randomclouds@endw)}
        \pgfmathsetmacro\myh{\randomclouds@endh+\myop*(\randomclouds@starth-\randomclouds@endh)}
        \node[shape=cloud, cloud puffs={10+int(5*rnd)},fill=\randomclouds@c, opacity=\myop,
        minimum width=\myw,minimum height=\myh]
        at (rand * 1cm,rand * 1cm) {};
      }},
  },
}
\makeatother

\pgfmathsetseed{\pdfuniformdeviate 1000000}

\begin{document}
\begin{tikzpicture}
  \path[decorate,random clouds decoration]
  (0,0) -- (10,10);

  \path[decorate,random clouds decoration={
    color=orange,
    start width=12mm,end width=5mm,
    start height=22mm,end height=10mm,
  }]
  (5,0) -- (15,10);

\end{tikzpicture}
\end{document}

Responder2

Comecei tentando fazer o que era necessário, mas me desviei. O resultado parece legal (desde que você não olhe muito de perto), mascompletamenteimpraticável:

\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{decorations.pathmorphing,backgrounds}
\begin{document}
\begin{tikzpicture}[background rectangle/.style={fill=black},
show background rectangle]
\foreach \i in {1,...,10}
\fill [gray, even odd rule, opacity=0.125,rounded corners=2pt, decoration={random steps, amplitude=.125cm, segment length=.125cm}, decorate]
(0,0) plot [domain=0:360, samples=50] ({sin(\x*4)/500*\x+rand/(2.9-\x/180)}, \x/100+rand/2) -- 
plot [domain=360:0, samples=50] ({sin(\x*4)/500*\x+rand/(2.9-\x/180)}, \x/100+rand/2);
\end{tikzpicture}
\end{document}

insira a descrição da imagem aqui

Você provavelmente poderia fumar vários cachimbos de tabaco antes de compilar:

\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{decorations.pathmorphing,backgrounds}
\begin{document}
\foreach \n in {1,1.1,...,4}{
\begin{tikzpicture}[background rectangle/.style={fill=black},
show background rectangle]
\useasboundingbox (-5,4) rectangle (5,10);
\foreach \i in {1,...,10}
\fill [gray, even odd rule, opacity=0.125, decoration={random steps, amplitude=.125cm*\n, segment length=.125cm}, decorate]
(\n,\n*3) arc (0:360:\n\space and \n/4) arc (360:0:\n\space and \n/4) -- cycle;
\end{tikzpicture}
}
\end{document}

insira a descrição da imagem aqui

informação relacionada