使用 TikZ 绘制弦网

使用 TikZ 绘制弦网

我在画图时遇到问题与 TikZ 联网。

这是我目前的代码:

\begin{tikzpicture}
    \xdef\N{16}
    \xdef\deltadegree{360/\N}
    \draw[thick] (0,0) circle (6);

    \foreach \i in {0,...,15} {
        % predecessor
        \pgfmathparse{mod(\i-1,\N)}
        \draw[color=red] (-\i*\deltadegree+90:6) -- (-1*\pgfmathresult*\deltadegree+90:6);


        % successor
        \pgfmathparse{mod(\i+1,\N)}
            \draw (-\i*\deltadegree+90:6) -- (-1*\pgfmathresult*\deltadegree+90:6);

        % fingers
        \foreach \j in {0,...,4}{
            \pgfmathparse{mod(\i+2^\j,\N)}
            \draw (-\i*\deltadegree+90:6) -- (-1*\pgfmathresult*\deltadegree+90:6);
        }
    }

    \foreach \i in {0,...,15}
        \node[circle,fill=white,draw=black,thick] at (-\i*\deltadegree+90:6) {\i};
\end{tikzpicture}

这段代码的问题是,TikZ 只从节点 6 到其他每个节点绘制线条,但我认为它会遍历所有节点,计算每个手指的目的地,并绘制该线条。

我究竟做错了什么?

答案1

\pgfmathresultTikZ 会很快覆盖宏。您应该始终立即将结果分配给不同的宏,您可以使用以下命令执行此操作\pgfmathsetmacro{<macro name>}{<math expression>}(另请参阅这个问题)。

这是经过调整的代码。请注意,“后继”循环中的线条刚好覆盖了“前继”循环。

\documentclass{article}

\usepackage{tikz}
\begin{document}

\begin{tikzpicture}
    \xdef\N{16}
    \xdef\deltadegree{360/\N}
    \draw[thick] (0,0) circle (6);

    \foreach \i in {0,...,15} {
        % predecessor
        \pgfmathsetmacro{\result}{mod(\i-1,\N)}
        \draw[color=red] (-\i*\deltadegree+90:6) -- (-1*\result*\deltadegree+90:6);


        % successor
        \pgfmathsetmacro{\result}{mod(\i+1,\N)}
            \draw (-\i*\deltadegree+90:6) -- (-1*\result*\deltadegree+90:6);

        % fingers
        \foreach \j in {0,...,4}{
            \pgfmathsetmacro{\result}{mod(\i+2^\j,\N)}
            \draw (-\i*\deltadegree+90:6) -- (-1*\result*\deltadegree+90:6);
        }
    }

    \foreach \i in {0,...,15}
        \node[circle,fill=white,draw=black,thick] at (-\i*\deltadegree+90:6) {\i};
\end{tikzpicture}

\end{document}

相关内容