![为什么 TikZ 让我计算最终角度但不让我计算初始角度?](https://linux22.com/image/351434/%E4%B8%BA%E4%BB%80%E4%B9%88%20TikZ%20%E8%AE%A9%E6%88%91%E8%AE%A1%E7%AE%97%E6%9C%80%E7%BB%88%E8%A7%92%E5%BA%A6%E4%BD%86%E4%B8%8D%E8%AE%A9%E6%88%91%E8%AE%A1%E7%AE%97%E5%88%9D%E5%A7%8B%E8%A7%92%E5%BA%A6%EF%BC%9F.png)
该文件运行后,正如我所料,它完成了应有的工作。
\documentclass{amsart}
\usepackage{amssymb}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\def\centerarc[#1](#2)(#3:#4:#5)% Syntax: [draw options] (center) (initial angle:final angle:radius)
{ \draw[#1] ($(#2)+({#5*cos #3)},{#5*sin #3)})$) arc (#3:#4:#5); }
\draw (0,0) circle (2);
\foreach \x in {30,60,90}
%I want to add a calculation in the following line
\centerarc[]($2*(cos \x,sin \x)$)(\x:\x+150:2);
\end{tikzpicture}
\end{document}
但这不是我想要画的。我只想在圆内画圆弧。所以我希望初始角度为\x+120
。
但是当我尝试在表达式中的第一个参数 \x 上引入任何计算(+0 除外)时, (\x:\x+150:2)
图形会以我目前无法预测的方式发生变化。具体来说,我想要的角度 (\x+120:\x+150:2)
确实运行并生成了 pdf,但图形是不可见的,显然在 pdf 范围之外被放大了。
\x+150
但在同一个表达式中 计算第二个参数却没有问题(\x:\x+150:2)
。
我想了解这是为什么。但我想主要问题是我想知道如何改变它,以便我可以计算初始角度和最终角度。
答案1
在表达式中,cos
和sin
是具有一个参数的函数,必须将其括在括号中:
\draw[#1] ($(#2)+({#5*cos(#3)},{#5*sin(#3)})$) arc (#3:#4:#5);
代码:
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\def\centerarc[#1](#2)(#3:#4:#5){
% Syntax: [draw options] (center) (initial angle:final angle:radius)
\draw[#1] ($(#2)+({#5*cos(#3)},{#5*sin(#3)})$) arc (#3:#4:#5);
}
\draw (0,0) circle (2);
\foreach \x in {30,60,90} {
% I want to add a calculation in the following line
\centerarc[]($2*(cos \x,sin \x)$)(\x+120:\x+150:2);
}
\end{tikzpicture}
\end{document}
答案2
我不知道为什么\x+120
不能用作弧定义中的初始角度,但这里有两个不需要使用错误语法的替代解决方案。
第一个解决方案是使用cliping
圆内的圆弧:
\documentclass{amsart}
\usepackage{amssymb}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\def\centerarc[#1](#2)(#3:#4:#5)% Syntax: [draw options] (center) (initial angle:final angle:radius)
{ \draw[#1] ($(#2)+({#5*cos #3)},{#5*sin #3)})$) arc (#3:#4:#5); }
\draw (0,0) circle (2);
\begin{scope}
\clip (0,0) circle (2);
\foreach \x in {30,60,...,360}
%I want to add a calculation in the following line
\centerarc[]($2*(cos \x,sin \x)$)(\x:\x+150:2);
\end{scope}
\end{tikzpicture}
\end{document}
第二个使用evaluate
选项来foreach
计算\x+120
起始角度:
\documentclass{amsart}
\usepackage{amssymb}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\def\centerarc[#1](#2)(#3:#4:#5)% Syntax: [draw options] (center) (initial angle:final angle:radius)
{ \draw[#1] ($(#2)+({#5*cos #3)},{#5*sin #3)})$) arc (#3:#4:#5); }
\draw (0,0) circle (2);
\foreach \x [evaluate=\x as \start using \x+120] in {30,60,...,360}
%I want to add a calculation in the following line
\centerarc[]($2*(cos \x,sin \x)$)(\start:\x+150:2);
\end{tikzpicture}
\end{document}
两种解决方案都产生相同的结果: