我有一些 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,因为我们从 循环0
到N-1
。这会产生以下图片:
我想给这些向量贴上标签,让它们看起来都很漂亮,比如前三个向量分别对应 0/8、1/8 和 2/8。例如,有没有办法根据向量的角度指定锚点位置?你会如何做到这一点?
答案1
一种方法是使用label={<angle>:<label>}
来作为节点,并将节点内容留空。然后,您可以使用已经计算出的角度来确定标签的位置。
一些建议:
- 使用极坐标:比用和
(\t:\wcir)
计算直角坐标更简单(也更高效)。sin
cos
- 用来
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}
。