我正在尝试制作自己的自制光学编码器,以便能够控制它的一些参数,例如内半径和外半径以及车轮标记的数量。我希望它看起来像这样:
这是我目前所做的:
\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}