coordinate ["$P1$"] (P1) at ($(O1)!\length cm!48.59:(O2)$);
%coordinate ["$P1$"] (P1) at ($(O1)!\length cm!\pgfmathresult:(O2)$);%%%这里的pgfmathresult值为什么不正确?
\documentclass{ctexart}
\usepackage{ amssymb,amsmath, amsthm, amsfonts,thmtools,appendix, bm,framed,graphicx, mathrsfs}
\usepackage{tkz-euclide}
\usetikzlibrary{patterns,arrows,positioning,arrows.meta,calc,fadings,shapes,decorations.markings}
\begin{document}
\begin{tikzpicture}[scale=.6]
\draw[help lines] (0,0) grid (12,12);
\coordinate ["$O_1$"] (O1) at (1,3);
\coordinate ["$O_2$"] (O2) at (5,3);
\draw(O1) circle (1 cm);\draw(O2) circle (2 cm);
\pgfmathsetmacro{\length}{sqrt(7)}
\pgfmathasin{3/4}%\pgfmathresult %48.59
\coordinate ["$P1$"] (P1) at ($(O1)!\length cm!48.59:(O2)$);
%\coordinate ["$P1$"] (P1) at ($(O1)!\length cm!\pgfmathresult:(O2)$);%%%这里的\pgfmathresult值为什么不正确?
\draw(O1) circle (\length cm);
\coordinate ["$P$"] (P) at ($(P1)!1cm!0:(O2)$);
%\coordinate ["$A$"] (A) at ($(O2)!(P)!(P1)$);
\coordinate ["$B$"] (B) at ($(P)!\length cm!90:(P1)$);
\draw[red] (O2) -- (O1) (P) -- (B) (O1) -- (P1)--(O2);
\end{tikzpicture}
\pgfmathsetmacro{\length}{sqrt(7)}\pgfmathresult
\pgfmathasin{3/4}\pgfmathresult %48.59
\pgfmathatantwo{3}{sqrt(7)}\pgfmathresult
\end{document}
坐标的表达式提前不会展开宏,而是一步步解析,并且在解析表达式时会使用 \pgfmathparse
,这会修改 \pgfmathresult
的值,所以 \pgfmathresult
的值是不确定的。
而数学表达式 \pgfmath
等,会首先展开它的参数,这时 \pgfmathresult
已经被展开了,它的值已经固定。
\coordinate ["$P1$"] (P1) at ($(O1)!\length cm!\pgfmathresult:(O2)$);
与
\coordinate ["$P1$"] (P1) at ($(O1)!\length cm!\length cm:(O2)$);
是一样的.
\pgfmathparse
解析 \length cm
, 得到 \pgfmathresult
, 然后再解析 \pgfmathresult:(O2)
这一部分.
多数 pgf
的数学函数都会把结果保存到 \pgfmathresult
, 命令 \pgfmathparse
总会把结果保存到 \pgfmathresult
.
如果需要某个 \pgfmathresult
, 最好及时转存它的值.
具体原因见 tikz 的 calc 库.
markdown
的行内代码不允许跨行hhhh使用
\pgfmathsetmacro
定义一个宏保存一下确实是更常见的做法