tkiz 圆上的度数间隔可视化不一致

tkiz 圆上的度数间隔可视化不一致

我使用以下代码来绘制一个以特定度数间隔带有数字标签的圆圈。变量\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如果存在其他情况,则刚好在限制范围内。

以下是上面未注释的代码的情况

修正后的第二种情况

相关内容