看看这里的 MWE,
\documentclass{standalone}
\usepackage{tikz}
\newcommand{\PolarToX}[2]{ {(#1)*cos(#2)}, {(#1)*sin(#2)} }
\begin{document}
\tikz{
\draw [very thick] (0, 0) \foreach \i in {0, 1, ..., 360} {-- (\PolarToX{4+.3*cos(20*\i)}{\i})};
}
\end{document}
输出如下内容,
我不想在中间画一条线。所以我尝试这样做,
\draw [very thick] \foreach \i in {0, 1, ..., 360} { (\PolarToX{4+.3*cos(20*\i)}{\i}) -- } cycle;
不起作用。下面这个也不起作用:
\draw [very thick] (0,0) \foreach \i in {0, 1, ..., 360} { (\PolarToX{4+.3*cos(20*\i)}{\i}) -- } cycle;
为什么以上两种方法都不起作用?正确的方法是什么?
答案1
两件事情:
- TikZ 有极坐标:
(<angle>:<radius>)
甚至(<angle>:<x radius> and <y radius>)
。 - TikZ 有一个绘图功能,
- 基本上本身就是一个循环
- 但要小心处理路径的开始和结束。
这意味着你可以这样做
\documentclass[tikz]{standalone}
\begin{document}
\tikz
\draw[very thick]
plot[samples at = {0, ..., 359}, sharp cycle] (\x:{4+.3*cos(20*\x)});
\end{document}
并得到
这里我使用samples at
键(注意...
符号!)来明确描述应该使用的值\x
。如果没有其他选项,它只会向第一个坐标发出移动到(除非您使用-- plot
),然后--
向所有其他坐标发出一行()。
该键末尾sharp cycle
会添加一个。-- cycle
笔记:事实上并非如此,它在 PGF 级别上运行,但这基本上就是plot
界面的工作方式。
答案2
只需将点 (0,0) 替换为第一个点即可。如下所示:
\documentclass{standalone}
\usepackage{tikz}
\newcommand{\PolarToX}[2]{ {(#1)*cos(#2)}, {(#1)*sin(#2)} }
\begin{document}
\tikz{
\draw [very thick] (\PolarToX{4.3}{0}) \foreach \i in { 1, ..., 360} {-- (\PolarToX{4+.3*cos(20*\i)}{\i})};
}
\end{document}
您尝试的方法不起作用的原因是,扩展之后\foreach
,您的表达式总是以 开头--
或--
在结尾处有一个悬垂部分,这两者都不符合\draw
tikz 中的正确语法。
答案3
由于\draw [very thick] \foreach \i in {0,...,5} {--node[pos=0,below] {\i} ++(1,0)};
模式以 开头\i=1
,因此只需删除节点(0,0)
即可关闭,我们在 360 后放置 1\foreach \i in {0, ..., 360,1}
\documentclass{article}
\usepackage{tikz}
\newcommand{\PolarToX}[2]{ {(#1)*cos(#2)}, {(#1)*sin(#2)} }
\begin{document}
\tikz{
\draw [very thick] \foreach \i in {0, ..., 360,1} {-- (\PolarToX{4+.3*cos(20*\i)}{\i})};
}
% \bigskip
% \tikz{
% \draw [very thick] \foreach \i in {0,...,5} {--node[pos=0,below] {\i} ++(1,0)};
% }
\end{document}