我使用以下代码来绘制一个以特定度数间隔带有数字标签的圆圈。变量\FullLength
(见第 5 行)由此允许用户输入。
\documentclass[margin=5pt]{standalone}
\usepackage{tikz}
\usepackage{fp}
\def \FullLength {160000} % user-input
\FPeval{\BPperDegr}{\FullLength/360}
\FPeval{\DegrperBP}{1/\BPperDegr}
\FPeval{\DegrperTenKBP}{10000/\BPperDegr}
\FPeval{\FirstInterval}{round(\DegrperTenKBP, 2)}
\FPeval{\SecondInterval}{round(\DegrperTenKBP*2, 2)}
\FPeval{\SecondToLastInterval}{round(360-(\DegrperTenKBP*2), 2)}
\FPeval{\LastInterval}{round(360-\DegrperTenKBP, 2)}
\def \CircleIntervals {\FirstInterval,\SecondInterval,...,\SecondToLastInterval,\LastInterval}
\begin{document}
\begin{tikzpicture}[line cap=rect, line width=3pt]
\draw[] (0,0) circle [radius=4cm];
\foreach \angle [count=\xi] in \CircleIntervals
{
\FPeval{\label}{round(\xi*10000, 0)}
\draw[line width=1.5pt] (\angle:3.9cm) -- (\angle:4.1cm);
\node[font=\large] at (\angle:4.75cm) {\label};
}
\draw[line width=3pt] (0:3.9cm) -- (0:4.1cm);
\node[font=\large] at (0:4.75cm) {origin};
\node[red] at (0:0) {
\textbf{\FullLength}; \CircleIntervals
};
\end{tikzpicture}
\end{document}
只要变量\FullLength
大于整数159982
(例如160000
),我就会得到度间隔的一致可视化。
然而,一旦变量\FullLength
等于或小于整数159982
,度间隔的可视化就会变得不一致。
问题显然在于如何\CircleIntervals
构造变量,但我无法找到正确的解决方案,以便用户指定的任何整数都能产生一致的可视化。
答案1
问题是,当您说 时\foreach ... {\one,\two,...,\penultimate,\last}
,TikZ 会将其视为{\one,\two,...,\penultimate}
和的结合\last
。\penultimate
上限也是如此。只有等于或小于此值的值才算数。由于 314.99 不是 22.50 加上 22.51 的某个倍数,因此它只是充当上限。因此,314.99 处没有步骤,下一个步骤是 337.50。
我不太确定fp
这里使用而不是 PGF 数学的意义何在。但是,调整现有代码以执行您想要的操作的最简单方法可能是使用 360 作为上限,然后进行测试以确保我们不会在那里制作第二个标签。
例如,
\documentclass[margin=5pt]{standalone}
\usepackage{tikz}
\usepackage{fp}
\def \FullLength {159982} % user-input
% \def \FullLength {160000} % user-input
\FPeval{\BPperDegr}{\FullLength/360}
\FPeval{\DegrperBP}{1/\BPperDegr}
\FPeval{\DegrperTenKBP}{10000/\BPperDegr}
\FPeval{\FirstInterval}{round(\DegrperTenKBP, 2)}
\FPeval{\SecondInterval}{round(\DegrperTenKBP*2, 2)}
\FPeval{\SecondToLastInterval}{round(360-(\DegrperTenKBP*2), 2)}
\FPeval{\LastInterval}{round(360-\DegrperTenKBP, 2)}
\def \CircleIntervals {\FirstInterval,\SecondInterval,...,360}
\begin{document}
\begin{tikzpicture}[line cap=rect, line width=3pt]
\draw[] (0,0) circle [radius=4cm];
\foreach \angle [count=\xi, evaluate=\angle as \i using int(\angle)] in \CircleIntervals
{
\ifnum\i=360\relax\else
\FPeval{\label}{round(\xi*10000, 0)}
\draw[line width=1.5pt] (\angle:3.9cm) -- (\angle:4.1cm);
\node[font=\large] at (\angle:4.75cm) {\label};
\fi
}
\draw[line width=3pt] (0:3.9cm) -- (0:4.1cm);
\node[font=\large] at (0:4.75cm) {origin};
\node[red] at (0:0) {
\textbf{\FullLength}; \CircleIntervals
};
\end{tikzpicture}
\end{document}
在两种情况下都给出了预期结果。如有必要,您可以使用>355
或某些内容,而不是=360
如果存在其他情况,则刚好在限制范围内。
以下是上面未注释的代码的情况