在 TikZ foreach 循环中更改锚点位置?

在 TikZ foreach 循环中更改锚点位置?

我有一些 TikZ 代码来生成一个单位圆,其中N均匀分布的矢量从圆心到圆周。

\begin{tikzpicture}     
\newcommand\wpic{4}
\newcommand\wcir{3}
\newcommand\Nm1{7}
\draw[help lines, color=gray, dashed] (-\wpic,-\wpic) grid (\wpic,\wpic);
\draw[->,ultra thick] (-\wpic,0)--(\wpic,0) node[right]{Re};
\draw[->,ultra thick] (0,-\wpic)--(0,\wpic) node[above]{Im};
\draw[blue,thick] (0,0) circle(\wcir cm);
\foreach \i in {0,...,7} {
    \draw[line width=2pt,red,-stealth] (0,0)--({\wcir*cos(deg(2*pi*(\i/8)))},{\wcir*sin(deg(2*pi*(\i/8)))}) node[anchor= south west]{$e^{i2\pi\frac{\i}{8}}$};
}
\end{tikzpicture}

请注意,该命令\Nm1表示向量数量减 1,因为我们从 循环0N-1。这会产生以下图片:

在此处输入图片描述

我想给这些向量贴上标签,让它们看起来都很漂亮,比如前三个向量分别对应 0/8、1/8 和 2/8。例如,有没有办法根据向量的角度指定锚点位置?你会如何做到这一点?

答案1

一种方法是使用label={<angle>:<label>}来作为节点,并将节点内容留空。然后,您可以使用已经计算出的角度来确定标签的位置。

一些建议:

  1. 使用极坐标:比用和(\t:\wcir)计算直角坐标更简单(也更高效)。sincos
  2. 用来evaluate避免多次计算角度。我将角度设置为\t

以下是代码:

\foreach \i [evaluate=\i as \t using deg(2*pi*(\i/8))] in {0,...,7} {
    \draw[line width=2pt,red,-stealth] (0,0)--(\t:\wcir) node[label={\t:$e^{i2\pi\frac{\i}{8}}$}]{};
}

在此处输入图片描述

结果可能不是您想要的,因为轴使得标签放置有些尴尬。如果您希望每个标签都有自定义放置位置,则可以更改循环\foreach以包含标签角度:\foreach\i/\l in ...允许您为每个标签选择角度:

\foreach \i/\l [evaluate=\i as \t using deg(2*pi*(\i/8))] in {0/45,1/45,2/45,3/135,4/135,5/225,6/-45,7/-45} {
    \draw[line width=2pt,red,-stealth] (0,0)--(\t:\wcir) node[label={\l:$e^{i2\pi\frac{\i}{8}}$}]{};
}

在此处输入图片描述

如果标签太远,不符合您的口味,您可以通过设置label distance=为负值来调整它们

node[label={[label distance=-6pt]\l:$e^{i2\pi\frac{\i}{8}}$}]{}

在此处输入图片描述

答案2

首先请注意,由于1不是字母(其标准类别代码为 12,而不是 11),因此您的\newcommand\Nm1{7}操作不符合您的预期:它

  • 定义\Nm不带参数的命令,并1以替换文本为参数,

  • 然后7使用当前字体排版。当您的代码执行此操作时,当前字体为\nullfont,因此 TeX 会打印以下警告:

    缺少字符:字体 nullfont 中没有 7!

现在,关于图片,为了获得真正漂亮的输出,似乎需要对角度和偏移进行一些微调。以下是使用以下方法的可能性:

  • 两个pgfmath数组(\myangles\myoffsets);

  • 一些排版公式的自动计算(\i= 0 的特殊情况和指数函数参数中分子的简单计算);

  • 没有空节点(@SandyG 使用label应用于空节点的键;在这里,我们使用anchor={\myangles[\i] + 180}包含公式的节点实现了类似的效果 - 并不是说​​空节点不好)。

pgfmath与类似的东西相比,数组的优势不大\foreach \i/\l in {0/45,1/45,2/45,3/135,4/135,5/225,6/-45,7/-45}:我们不必枚举值 0、1、2、3、4、5、6、7——这些可以自动生成。

注:[evaluate=\i as \t using deg(2*pi*(\i/8))]取自Sandy G 的回答

\documentclass[tikz, border=2mm]{standalone}

\begin{document}
\begin{tikzpicture}
  \newcommand{\wpic}{4}
  \newcommand{\wcir}{3}

  \draw[help lines, color=gray, dashed] (-\wpic,-\wpic) grid (\wpic,\wpic);
  \draw[->, very thick] (-\wpic,0) -- (\wpic,0) node[right]{Re};
  \draw[->, very thick] (0,-\wpic) -- (0,\wpic) node[above]{Im};
  \draw[blue, thick] (0,0) circle[radius=\wcir cm];

  \def\myangles{{     52,    42,    42,   135,   135,   225,   -38,    -45}}
  \def\myoffsets{{0.22em, 0.2em, 0.3em, 0.1em, 0.3em, 0.3em, 0.3em, 0.18em}}

  \foreach \i [evaluate=\i as \t using deg(2*pi*(\i/8))] in {0,...,7} {
    \draw[very thick, red!90!black, ->] (0,0) -- (\t:\wcir) coordinate (P);
    \path (P) ++(\myangles[\i]:\myoffsets[\i])
      node[anchor={\myangles[\i] + 180}]
        {$\ifnum\i=0 1\else e^{i\frac{\the\numexpr 2*\i\relax \pi}{8}}\fi$};
  }
\end{tikzpicture}
\end{document}

在此处输入图片描述

PS:以后请提供完全的可编译代码,以 开头\documentclass,以 结尾\end{document}

相关内容