Evitar el cambio del punto central de sombreado cuando se utilizan coordenadas relativas

Evitar el cambio del punto central de sombreado cuando se utilizan coordenadas relativas

Estoy escribiendo algunas macros que permiten dibujar formas de bolas de forma arbitraria en \foreachbucles:

\documentclass[tikz, border=0.5in]{standalone}
\newcommand{\ball}[3][0,0]{%\ball[basepoint]{point}{diameter}
    \shadedraw[ball color=blue!15!white, draw=blue!50] (#1) +(#2) circle (#3);
}

\begin{document}
\begin{tikzpicture}
    \foreach \t in {10, 20, ..., 360}{
        \ball{\t:6}{0.5}
    }
    \ball{0,0}{0.5}

    \foreach \t in {10, 20, ..., 360}{
        \ball[14,0]{\t:6}{0.5}
    }
    \ball{14,0}{0.5}
\end{tikzpicture}
\end{document}

Producción

Estoy usando coordenadas relativas para permitir el uso de coordenadas polares no centradas en el origen, como se puede ver arriba. Desafortunadamente, mi sombreado no funciona como esperaba.

Espero obtener un resultado como este, pero usando las coordenadas relativas:

\documentclass[tikz, border=0.5in]{standalone}
\begin{document}
\begin{tikzpicture}
    \foreach \t in {10, 20, ..., 360}{
        \shadedraw[ball color=blue!15!white, draw=blue!50] (\t:6) circle (0.5);
    }
    \shadedraw[ball color=blue!15!white, draw=blue!50] (0,0) circle (0.5)
\end{tikzpicture}
\end{document}

Rendimiento esperado

Parece que el algoritmo de sombreado no tiene en cuenta que el centro de los círculos dibujados se mueve en relación con (0,0). ¿Es posible redefinir el origen del sombreado?

Respuesta1

Para limitar el cuadro delimitador de su trazado sombreado, el punto base no debe aparecer en este trazado.

Aquí hay cuatro soluciones:

  • \ballshift: utilice una shiftoperación en su centro,
  • \ballscope: utilizar un local scopecon un origen desplazado,
  • \ballcalc: utilícelo calcpara cambiar su centro,
  • \ballnode: utilice un nodo circular con sombreado.

ingrese la descripción de la imagen aquí

\documentclass[tikz, border=0.5in]{standalone}
\usetikzlibrary{calc}
\newcommand{\ballshift}[3][0,0]{%\ball[basepoint]{point}{diameter}
    \shadedraw[ball color=blue!15!white, draw=blue!50] ([shift={(#1)}]#2) circle (#3);
}
\newcommand{\ballscope}[3][0,0]{%\ball[basepoint]{point}{diameter}
  \begin{scope}[shift={(#1)}]
    \shadedraw[ball color=red!15!white, draw=red!50] (#2) circle (#3);
  \end{scope}
}
\newcommand{\ballcalc}[3][0,0]{%\ball[basepoint]{point}{diameter}
    \shadedraw[ball color=orange!15!white, draw=orange!50] ($(#1)+(#2)$) circle (#3);
}
\newcommand{\ballnode}[3][0,0]{%\ball[basepoint]{point}{diameter}
    \path (#1) ++(#2) node[inner sep=0,circle,minimum size=2cm*#3,
    ball color=lime!50!white,draw=lime]{};
}

\begin{document}
\begin{tikzpicture}
    \foreach \t in {10, 20, ..., 360}{
        \ballshift{\t:6}{0.5}
        \ballscope{\t:5}{0.4}
        \ballcalc{\t:4}{0.3}
        \ballnode{\t:3}{0.2}
    }
    \ballshift{0,0}{0.5}

    \foreach \t in {10, 20, ..., 360}{
        \ballshift[14,0]{\t:6}{0.5}
        \ballscope[14,0]{\t:5}{0.4}
        \ballcalc[14,0]{\t:4}{0.3}
        \ballnode[14,0]{\t:3}{0.2}
    }
    \ballshift{14,0}{0.5}
\end{tikzpicture}
\end{document}

información relacionada