正时轮怎么画

正时轮怎么画

我需要在 tikz 中绘制这个计时轮图像。有人能帮我吗?我刚刚尝试开始绘制一个普通的圆形阵列图像,但这不是我想要的结果。

定时轮

编辑:

这是我的尝试:

\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}[>=latex,font=\sffamily,semithick,scale=2.5]
\draw [thick] (0,0) circle (1);
\foreach \angle in {90,67.5,...,-67.5}
\draw (\angle:1) -- (\angle-180:1);
\node [circle,thick,fill=white,draw=black,align=center,minimum size=3.5cm] at (0,0) {};
\draw [->] (0,0) -- (0.4,0.6);
\end{tikzpicture}
\end{document}

答案1

您可以使用pics 来定义所需的形状。在这里,我使用 2 pics -timertick。其中第一个采用单个参数,指定应在“时钟上的位置”进行阴影处理并绘制箭头。第二个为 绘制箭头Tick!

我使用计数器timer来命名这两种类型,pic因为 s 的当前代码pic存在错误,并且按照手册中建议的方式命名它们不再有效。(例如,seagull手册中的示例已经有一段时间没有编译了。)

\newcounter{timer}
\setcounter{timer}{0}

接下来我们定义这两个pic

\tikzset{
  timer/.pic={
    \stepcounter{timer}

增加计数器,以便每个实例获得一个唯一的标识符,从 1 开始。

    \begin{scope}[scale=2.5]

我们先填充一个圆圈并创建阴影。我们暂时不画它,因为我们想在画线之前先给边框上的部分加阴影。

      \fill [fill=white, drop shadow] (0,0) circle (1);

现在来看看完成大部分繁重工作的循环。它只是问题中原始版本的扩展版本:

      \foreach \i [count=\j from 0] in {90,67.5,...,-247.5}
      {
        \ifnum\j>#1

#1是箭头指向的阴影部分。如果我们已经这样做了,标签只需要是我们所在循环的编号。我们还会画出线条,就像问题中的原始循环一样。

          \draw (\i:1.2) node (timer\thetimer-\j) {\j} (\i:1) -- (\i:0.7) ;
        \else

否则,标签就不仅仅是循环的编号了。我们想要的是循环编号加上 16 的值,因此我们保存了以下内容:

          \pgfmathsetmacro\modon{int(16+\j)}

我们有两种情况:要么我们处于突出显示的部分,要么我们不在。

          \ifnum\j=#1

如果是,我们首先用灰色填充该部分:

            \fill [gray] (\i:1) arc (\i:\i-22.5:1) -- (\i-22.5:.7) arc (\i-22.5:\i:.7) -- cycle;

现在我们画线并添加双标签(即我们刚刚计算的值)、正斜杠和循环数:

            \draw (\i:1.2) node (timer\thetimer-\j) {\modon/\j} (\i:1) -- (\i:0.7) ;
          \else

如果不是,则我们在目标段之前,因此我们绘制线条并在标签上写入值 16 加上循环数:

            \draw (\i:1.2) node (timer\thetimer-\j) {\modon} (\i:1) -- (\i:0.7) ;
          \fi
        \fi
      }

现在我们画内圆和外圆:

      \draw [thick] (0,0) circle (1) circle (.7);

最后,我们添加箭头:

      \draw [-{Triangle[]}, draw=cyan!75!blue!75, line width=1mm] (0,0) -- (90-#1*22.5-11.25:.71);
    \end{scope}
  },

嵌套tick pic,它只是一个带有文字“Tick!”的填充箭头形状:

  tick/.pic={
    \node (tick\thetimer) [shape=single arrow, fill=yellow!50!orange!50, draw=yellow!50!orange, pic actions, transform shape, drop shadow] {Tick!};

为了方便起见,我们在箭头尖端创建一个命名坐标:

    \coordinate (tick\thetimer-tip) at (tick\thetimer.east);
  }
}

我们已经定义了pic上面的 s,因此第一个timertimer1,第二个是timer2等等,第一个ticktick1等等。

tick此外,我们将的尖端命名为tick<number>-tip,并将 边框上的每个标签命名为timer标签模 16 的值。例如,

  • timer1-4是包含标记第一个点上的第四个点的标签的节点,即,如果是节点而不是,则的锚点timer是什么;.easttimer1timer1pic
  • timer2-0timer将是第二个(标记为16/0或)的最北标签16

可能看一张图片比尝试解释这一点更容易 ;):

滴答作响的计时器

因此,tick箭头可以相对于最左侧计时器(timer1-4.east)标签的右中点放置。然后相对于箭头的右中点(即其尖端)放置。或者,等效地,我们可以使用。4timer2(tick1.east)(tick1-tip)

也就是说,设置好pics 的代码后,我们只需输入以下命令即可绘制上图:

\begin{tikzpicture}[font=\sffamily,semithick]
  \pic  {timer=0};
  \path (timer1-4.east) ++(1,0) pic {tick} (tick1.east) ++(3.5,0) pic {timer=1};
\end{tikzpicture}

或者,举一个更复杂的例子,

\begin{tikzpicture}[font=\sffamily,semithick]
  \pic  {timer=0};
  \path (timer1-4.east) ++(1,0) pic {tick} (tick1-tip) ++(3.5,0) pic {timer=1} (timer2-8.south) ++(0,-1) pic [rotate=-90] {tick} (tick2-tip) ++(0,-3.5) pic {timer=11} (timer3-12.west) ++(-1,0) pic [rotate=-180] {tick} (tick3-tip) ++(-3.5,0) pic {timer=14};
\end{tikzpicture}

生产

滴答滴答

完整代码:

\documentclass[tikz,border=10pt,multi]{standalone}
\usetikzlibrary{shadows,arrows.meta,shapes.arrows}
\begin{document}
\newcounter{timer}
\setcounter{timer}{0}
\tikzset{
  timer/.pic={
    \stepcounter{timer}
    \begin{scope}[scale=2.5]
      \fill [fill=white, drop shadow] (0,0) circle (1);
      \foreach \i [count=\j from 0] in {90,67.5,...,-247.5}
      {
        \ifnum\j>#1
          \draw (\i:1.2) node (timer\thetimer-\j) {\j} (\i:1) -- (\i:0.7) ;
        \else
          \pgfmathsetmacro\modon{int(16+\j)}
          \ifnum\j=#1
            \fill [gray] (\i:1) arc (\i:\i-22.5:1) -- (\i-22.5:.7) arc (\i-22.5:\i:.7) -- cycle;
            \draw (\i:1.2) node (timer\thetimer-\j) {\modon/\j} (\i:1) -- (\i:0.7) ;
          \else
            \draw (\i:1.2) node (timer\thetimer-\j) {\modon} (\i:1) -- (\i:0.7) ;
          \fi
        \fi
      }
      \draw [thick] (0,0) circle (1) circle (.7);
      \draw [-{Triangle[]}, draw=cyan!75!blue!75, line width=1mm] (0,0) -- (90-#1*22.5-11.25:.71);
    \end{scope}
  },
  tick/.pic={
    \node (tick\thetimer) [shape=single arrow, fill=yellow!50!orange!50, draw=yellow!50!orange, pic actions, transform shape, drop shadow] {Tick!};
    \coordinate (tick\thetimer-tip) at (tick\thetimer.east);
  }
}
\begin{tikzpicture}[font=\sffamily,semithick]
  \pic  {timer=0};
  \path (timer1-4.east) ++(1,0) pic {tick} (tick1.east) ++(3.5,0) pic {timer=1};
\end{tikzpicture}
\setcounter{timer}{0}
\begin{tikzpicture}[font=\sffamily,semithick]
  \pic  {timer=0};
  \path (timer1-4.east) ++(1,0) pic {tick} (tick1-tip) ++(3.5,0) pic {timer=1} (timer2-8.south) ++(0,-1) pic [rotate=-90] {tick} (tick2-tip) ++(0,-3.5) pic {timer=11} (timer3-12.west) ++(-1,0) pic [rotate=-180] {tick} (tick3-tip) ++(-3.5,0) pic {timer=14};
\end{tikzpicture}
\end{document}

相关内容