TikZ:如何绘制光学编码轮?

TikZ:如何绘制光学编码轮?

我正在尝试制作自己的自制光学编码器,以便能够控制它的一些参数,例如内半径和外半径以及车轮标记的数量。我希望它看起来像这样:

光学编码轮

这是我目前所做的:

\documentclass{standalone}
\usepackage{tikz}
%\usepackage{forloop}
\usetikzlibrary{calc}

\begin{document}

\newlength{\innerRadius}
\setlength{\innerRadius}{3mm}
\newlength{\outerRadius}
\setlength{\outerRadius}{4mm}

\newcounter{loops}
\setcounter{loops}{4}

\begin{tikzpicture}
  \coordinate (c1) at (0,0);
  \draw[fill=black] (c1) circle (.005cm);
  \draw (c1) circle (\innerRadius);
  \draw (c1) circle (\outerRadius);
  \foreach \i in {1,...,loops}
  {
       %\pgfmathtruncatemacro{\angle}{45*\i}
       \draw[fill=black] ($(c1) + (0:\innerRadius)$) arc (0:45:\innerRadius) -- ($(c1) + (45:\outerRadius)$) arc (45:0:\outerRadius) -- cycle;
  };
\end{tikzpicture}
\end{document}

我无法根据“循环”变量指定的数字来绘制每个标记,因为 pgfmath 函数抛出了错误,而我不知道原因。

有什么方法可以绘制这个编码轮吗?谢谢。

答案1

例如:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
  \def\innerRadius{30mm}
  \def\outerRadius{40mm}
  \def\wheelMarks{50}
  \def\cRadius{2mm}
  \def\cLen{8mm}
  \coordinate (c1) at (0, 0);

  % Wheel markings
  \fill
    let \n0={360/\wheelMarks} in
      \foreach \i in {1, ..., \wheelMarks} {
        let \n1={\i*\n0} in
          (c1) -- (\n1:\outerRadius)
          arc(\n1:\n1 + \n0/2:\outerRadius)
          -- ($(c1) + (\n1 + \n0/2:\innerRadius)$)
          arc(\n1 + \n0/2:\n1:\innerRadius)
          -- cycle
    }
  ;

  \draw
    % Wheel circles
    (c1) circle[radius=\outerRadius]
         circle[radius=\innerRadius]
    % Center markings with circle and cross
         circle[radius=\cRadius]
    ($(c1) - (\cLen, 0)$) -- ++(2*\cLen, 0)
    ($(c1) - (0, \cLen)$) -- ++(0, 2*\cLen)
  ;

\end{tikzpicture}
\end{document}

结果

答案2

制作绝对编码器的另一种解决方案

在此处输入图片描述

\documentclass[border=5mm,tikz]{article}
\usepackage{mwe}
\usepackage{tikz}
\usetikzlibrary{positioning,calc}

\usepackage{xcolor}
\begin{document}


\begin{tikzpicture}
\pgfmathsetmacro{\Ra}{4}

\foreach \nb in {0,1,2,3,4,5}{
\pgfmathsetmacro{\Rext}{\Ra+\nb*0.8}
\pgfmathsetmacro{\Rint}{\Rext-0.8}
\draw (0,0) circle (\Rext);
\pgfmathsetmacro{\nbfentes}{2^\nb}
\pgfmathsetmacro{\pas}{180/\nbfentes}
\foreach \aa in {1,...,\nbfentes}{
\draw[fill,rotate=2*\aa*\pas] (0:\Rint) -- (0:\Rext) arc (0:\pas:\Rext) -- (\pas:\Rint ) arc (\pas:0:\Rint);
}
}

\end{tikzpicture}

\end{document}

答案3

另一种解决方案是使用虚线圆代替环。

\documentclass[tikz,border=7mm]{standalone}
\usetikzlibrary{angles}

\begin{document}
  % parameters to set
  \def\minR{3}
  \def\maxR{4}
  \def\numMarks{50}
  % some calculations
  \pgfmathsetmacro{\midR}{(\minR+\maxR)/2}
  \pgfmathsetmacro{\dR}{\maxR-\minR}
  \pgfmathsetmacro{\dM}{2*pi*\midR/(2*\numMarks)}
  % the picture
  \begin{tikzpicture}
    \draw circle(\minR/4) (-\minR/2,0) -- (\minR/2,0)  (0,-\minR/2) -- (0,\minR/2);
    \draw circle(\minR) circle(\maxR);
    \draw[line width=\dR cm,dash pattern=on \dM cm off \dM cm] circle(\midR);
  \end{tikzpicture}
\end{document}

在此处输入图片描述

答案4

轮图我写的包,可以使用。

环的数量由 决定\n。每个环中的切片数为2^\i(其中\i从 1 到\n),并将其传递给密钥total count

在密钥中slices style我们使用\WClistcolors引用给定密钥的列表中的项目WClistcolors

在此处输入图片描述

\documentclass[border=6pt]{standalone}
\usepackage{wheelchart}
\begin{document}
\begin{tikzpicture}
\def\n{7}
\foreach\i in {1,...,\n}{
  \wheelchart[
    radius={\i+1}{\i+2},
    slices style={
      \WClistcolors,
      draw=gray,
      ultra thick
    },
    start half=0,
    total count=2^\i,
    WClistcolors={white,black}
  ]{}
}
\end{tikzpicture}
\end{document}

相关内容