我在一个圆圈上绘制节点,并从基于坐标绘制线条切换到基于命名节点绘制线条。
现在的问题是,使用以下代码,线条会停止在节点的边缘,但不指向中心。
我该如何解决?
\begin{tikzpicture}
\xdef\nodes{16}
\pgfmathsetmacro{\nodesminusone}{\nodes-1}
\pgfmathsetmacro{\N}{log2(\nodes)}
\xdef\deltadegree{360/\nodes}
\draw (0,0) circle (6);
\foreach \i in {0,...,\nodesminusone}
\node[circle,fill=white,draw=black,thick] (node\i) at (-\i*\deltadegree+90:6) {\i};
\foreach \i in {0,...,\nodesminusone}{
\foreach \j in {0,...,\N}{
\pgfmathsetmacro{\result}{mod(\i+2^\j,\nodes)}
\draw[->,thick,color=black!10] (node\i) -- (node\result);
}
}
\foreach \i in {2} {
% predecessor
\pgfmathsetmacro{\result}{mod(\i-1,\nodes)}
\draw (node\i) -- (node\result);
% successor
\pgfmathsetmacro{\result}{mod(\i+1,\nodes)}
\draw (node\i) -- (node\result);
% fingers
\foreach \j in {0,...,\N}{
\pgfmathsetmacro{\result}{mod(\i+2^\j,\nodes)}
\draw[->,color=blue,thick] (node\i) -- (node\result);
}
}
\end{tikzpicture}
答案1
\pgfmathsetmacro
用。。。来代替\pgfmathtruncatemacro
。
发生这种情况的原因是\pgfmathsetmacro
返回的是浮点数(或定点数?),而不是整数。例如:
\foreach \j in {0,...,\N}{
\pgfmathsetmacro{\result}{mod(\i+2^\j,\nodes)}
\draw[->,color=blue,thick] (node\i) -- (node\result);
}
这里\result
将是0.0
、1.0
等(无论 的结果是什么mod
)。然而(node1.0)
表示“节点‘node1’在角度 0 度处”,它将箭头绘制到该点。\pgfmathtruncatemacro
将.0
被截断,并且仅 (node1)
使用等,这将给出想要的结果。