Caminho com gradiente de opacidade em tikz

Oct 31 2020

Inspirado por esta pergunta , gostaria de desenhar um símbolo do infinito cuja opacidade muda ao longo do caminho, o que consegui até agora é o seguinte:

\documentclass[tikz]{standalone}

\usetikzlibrary{decorations.markings}

\pagecolor{yellow}

\definecolor{col1}{RGB}{127,127,127}
\definecolor{col2}{RGB}{240,240,240}

\begin{document}

\begin{tikzpicture}
    \path[postaction={
        decorate,
        decoration={
            markings,
            mark=between positions 0 and \pgfdecoratedpathlength step 0.5pt with {
                \pgfmathsetmacro\myval{multiply(divide(
                    \pgfkeysvalueof{/pgf/decoration/mark info/distance from start}, \pgfdecoratedpathlength),100)};
                \pgfsetfillcolor{col1!\myval!col2};
                \pgfpathcircle{\pgfpointorigin}{0.1cm};
                \pgfusepath{fill};}
}}] plot[smooth cycle] coordinates{(0,0.7)(-0.2,0.35)(0,0)(1,0.7)(1.2,0.35)(1,0)};
\end{tikzpicture}

\end{document}

No entanto, existem dois problemas com isso:

(1) Este é afogado com gradiente de cor , não gradiente de opacidade , por exemplo, se eu usar esta imagem em um papel com fundo amarelo, ainda é cinza e branco, não cinza e amarelo.

(2) A borda do caminho, como você pode ver, não é lisa, parece que a borda é algum tipo de onda. (Eu acho que é porque o gradiente de cor é obtido desenhando muitos círculos e então a linha não parece muito reta. No entanto, eu não sei como consertar isso, exceto reduzir o step 0.5pt, mas se eu fizer isso o processo de desenho seria muito lento.)

Existe alguma maneira mais fácil de desenhar esta imagem corretamente?

Respostas

1 hpekristiansen Nov 01 2020 at 04:45

Desenho o símbolo com dois desbotamentos e experimento alinhá-los do lado direito.

Esta solução obviamente não é a ideal. O desbotamento não ocorre ao longo do caminho, mas de oeste para leste. Há uma diferença de cor e artefato de renderização onde as linhas se encontram no lado direito. Há um problema onde as linhas se cruzam - se fosse apenas transparência, poderia ter sido resolvido com a transparency group.

\documentclass[tikz]{standalone}
\usetikzlibrary {fadings, patterns}
\begin{document}
\begin{tikzpicture}
\pattern[pattern=checkerboard,pattern color=yellow](-1,-0.5) rectangle (1,0.5);
\begin{scope}
  \clip(-1,-0.5)--(0,-0.5)--(0.5,0)--(1,0)--(1,0.5)--(0,0.5)--(-0.5,0)--(-1,0)--cycle;
  \draw[darkgray, line width=5.5, path fading=west, fading transform={xscale=2, xshift=10},  line cap=round] plot[smooth] coordinates{(-0.7,0.02)(-0.5,-0.35)(0.5,0.35)(0.7,-0.02)};
\end{scope}
\begin{scope}
  \clip (-1,-0.5)--(1,-0.5)--(1,0)--(0.5,0)--(0,0.5)--(-1,0.5)--cycle;
  \draw[darkgray, line width=5.5, path fading=east, fading transform={xscale=2, xshift=10},  line cap=round] plot[smooth] coordinates{(-0.7,0)(-0.5,0.35)(0.5,-0.35)(0.7,0.02)}; 
\end{scope}
\end{tikzpicture}
\end{document}


Editar:

Isso é apenas para demonstrar que é possível cortar um caminho completamente fora do outro

\documentclass[tikz]{standalone}
\usetikzlibrary{fadings, patterns}
\begin{tikzfadingfrompicture}[name=myfading]
\clip(-1,-0.5)--(0,-0.5)--(0.5,0)--(1,0)--(1,0.5)--(0,0.5)--(-0.5,0)--(-1,0)--cycle;
\draw[white, line width=5.5, path fading=west, fading transform={xscale=2, xshift=10},  line cap=round] plot[smooth] coordinates{(-0.7,0.02)(-0.5,-0.35)(0.5,0.35)(0.7,-0.02)};
\draw[line width=5.5, line cap=round] plot[smooth] coordinates{(-0.7,0)(-0.5,0.35)(0.5,-0.35)(0.7,0.02)}; 
\end{tikzfadingfrompicture}
\begin{document}
\begin{tikzpicture}
\pattern[pattern=checkerboard,pattern color=yellow](-1,-0.5) rectangle (1,0.6);
\fill[path fading=myfading, left color = white, right color = gray] (-1,-1) rectangle (1,1);
\end{tikzpicture}
\end{document}

Isso poderia resolver o problema de sobreposição, mas sempre que tento usar tikzfadingfrompicture, recebo problemas de escala estranhos devido à minha falta de compreensão. -Vejohttps://tex.stackexchange.com/a/551723/8650