答案1
使用path picture
s 可以让 TikZ 的操作变得相对简单。路径图片基本上是一种可以放在路径内的绘图,而不是(或除了)填充。它将自动根据路径进行裁剪。
为了减少冗余,我定义了样式ell = <fill> : <shifting> : <node content>
:
<shifting>
由内部的因子 ⅟₃ 控制,shift=(left:#2/3)
也由此处指定的值控制。我只使用 0、1、2 和 3,但当椭圆之间的距离应该更小或更大时,您可以调整它们。
对于带有文本的节点,我们可以告诉 TikZ 所有节点都nodes
应该(0:5/6)
位于椭圆右侧中间的位置(因为 5/6 是 1 − ⅟₃/2,其中 ⅟₃ 与上面的因子相同)。这仅在您仅使用0
、1
、... 作为<shifting>
值时才有效。我选择anchor=mid
这样看起来更适合小写文本。如果我们使用ell*
节点,则将其放置在剩余空间的中间。
我们还可以使用text along path
装饰它将每个字母单独地沿着椭圆放置。
代码
\documentclass[tikz]{standalone}
\usepackage{tikz}
\usetikzlibrary{
calc,
decorations.text} % only needed for second picture
\begin{document}
\tikz[
x=3cm, y=2cm, radius=1, nodes={rotate=90, anchor=mid, at=(0:5/6)},
ell*/.style={
nodes={centered, at=($(path picture bounding box.west)!.5!(0:1)$)}, ell={#1}},
ell/.style args={#1:#2:#3}{fill=#1, draw=black, shift=(left:#2/3),
insert path={circle[] node {#3}}}]
\path [ell =gray!75!blue!30 : 0 : four, path picture={
\path[ell =gray : 1 : three];
\path[ell =gray!50 : 2 : two];
\path[ell*=gray!10 : 3 : one];
}];
\tikz[
x=3cm, y=2cm, radius=1,
text deco/.style={postaction=decorate, decoration={
name=text along path, raise=.5ex, text align=center, text={#1}}},
ell/.style args={#1:#2:#3}{
fill=#1, draw=black, shift=(left:#2/3), text deco={#3},
insert path={(down:1) arc[start angle=-180, delta angle=360]}}]
\path [ell=gray!75!blue!30 : 0 : four, path picture={
\path[ell=gray : 1 : three];
\path[ell=gray!50 : 2 : two];
\path[ell=gray!10 : 3 : one];
}];
\end{document}
输出
答案2
作为起点,您可以使用 TikZ 绘制几个椭圆并剪切它们:
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\fill[gray,draw=black] (0,0) ellipse [x radius=2cm, y radius=1cm];
\begin{scope}
\clip (0,0) ellipse [x radius=2cm, y radius=1cm];
\fill[lightgray,draw=black] (-2,0) ellipse [x radius=2cm, y radius=1cm];
\end{scope}
\node at (-1,0) {1};
\node at (1,0) {1};
\end{tikzpicture}
\end{document}