3DToolsManual.pdf
这篇文档的第8页,自动出虚线的那个例子,请教各位大佬,以下几段代码是什么意思?
\pgfmathsetmacro{\nA}{TDunit("(A_1)-(P_1)x(P_2)-(P_1)")}
\pgfmathsetmacro{\nC}{TDunit("(C_1)-(P_1)x(P_1)-(P_2)")}
\pgfmathtruncatemacro{\itest}{screendepth(\nA)>screendepth(\nC)?1:0}
\tikzset{3d/ordered paths/pA/.style={fill=red}}
\ifnum\itest=1
\tikzset{3d/draw ordered paths={pC,pB,pA}}
\else
\tikzset{3d/draw ordered paths={pA,pB,pC}}
\fi
命令 \pgfmathsetmacro
, \pgfmathtruncatemacro
, \tikzset
的作用可以参考 PGF 的手册。
命令
\pgfmathsetmacro{\nA}{TDunit("(A_1)-(P_1)x(P_2)-(P_1)")}
的意思是,先用 \pgfmathparse
解析 TDunit("(A_1)-(P_1)x(P_2)-(P_1)")
, 然后把解析结果保存到 \nA
中。其中的 TDunit
是在《tikzlibrary3dtools.code.tex》中定义的一个函数,定义是:
\pgfmathdeclarefunction{TDunit}{1}{%normalized vector
\begingroup%
\pgfmathsetmacro{\pgfutil@tmpv}{TD("#1")}%
\pgfmathsetmacro{\pgfutil@tmpn}{sqrt(TD("(\pgfutil@tmpv)o(\pgfutil@tmpv)"))}%
\ifdim\pgfutil@tmpn pt<0.002pt\relax
\PackageWarning{3dtools}{Vector too short, cannot normalize it.}%
\let\pgfmathresult\pgfutil@tmpv%
\else
\pgfmathsetmacro{\pgfutil@tmpn}{1/\pgfutil@tmpn}%
\pgfmathparse{TD("\pgfutil@tmpn*(\pgfutil@tmpv)")}%
\fi
\pgfmathsmuggle\pgfmathresult\endgroup}%
命令 \tikzset{3d/ordered paths/pA/.style={fill=red}}
定义一个 style, 也就是把 fill=red
保存到键 3d/ordered paths/pA
中。
命令 \tikzset{3d/draw ordered paths={pC,pB,pA}}
执行 3d/draw ordered paths={pC,pB,pA}
这个键,其中 pC,pB,pA
是键 3d/draw ordered paths
处理的参数。这个键在《tikzlibrary3dtools.code.tex》中定义:
\tikzset{...
...
3d/draw ordered paths/.code={%
\tikzset{3d/temporary list 1/.initial={#1},
3d/draw ordered path/.list={#1}}%
},...
...
}
我没有仔细阅读《tikzlibrary3dtools.code.tex》,不了解其中的函数、键、命令的具体作用。
建议先阅读 PGF 手册的 'Mathematical and Object-Oriented Engines' 的 Mathematical Engine 部分,以及 'Key Management' 部分。
我猜是向量运算,减号“-”是减法,字母“x”代表向量积。