
Я пишу несколько макросов, которые позволяют рисовать шары произвольной формы в \foreach
циклах:
\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}
Я использую относительные координаты, чтобы разрешить использование полярных координат, не центрированных в начале координат, как можно увидеть выше. К сожалению, мое затенение не работает так, как я ожидал.
Я надеюсь получить такой же результат, но используя относительные координаты:
\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}
Похоже, что алгоритм затенения не учитывает смещение центра нарисованных окружностей относительно (0,0). Возможно ли переопределить начало затенения?
решение1
Чтобы ограничить ограничивающую рамку вашего затененного контура, базовая точка не должна отображаться на этом контуре.
Вот четыре решения:
\ballshift
: используйтеshift
операцию на вашем центре,\ballscope
: использовать локальное значениеscope
со смещенным началом координат,\ballcalc
: используйтеcalc
для смещения центра,\ballnode
: используйте круглый узел с затенением.
\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}