上周我做了简单的坐标变换,以便\tdplotsetcoord
在笛卡尔坐标系中定义。我的工作和经验用户的支持可以查看在本主题中。代码如下:
\def\Sx{0} \def\Sy{0} \def\Sz{-3}
\tdplotsetcoord{S}{sqrt((\Sx)^(2) + (\Sy)^(2) + (\Sz)^(2))}{acos(\Sz/(sqrt((\Sx)^(2) + (\Sy)^(2) + (\Sz)^(2))))}{ifthenelse(\Sy<0,-acos(\Sx/(sqrt((\Sx)^(2) + (\Sy)^(2)))),acos(\Sx/(sqrt((\Sx)^(2) + (\Sy)^(2)))))} % {radius}{polar}{asimuth}
(0,0,z)
但是,由于这些数学表达式中的除法,笛卡尔坐标系存在问题zero
。我还尝试使用ifthenelse
命令手动定义从零 C. 坐标系的变换:
1)为什么variable = 0
不起作用?我得到了PGF Math Error: Unknown operator '=' or '=0'
。这是转换的示例polar angle
:
\pgfmathsetmacro\polar{ifthenelse(\Sx=0 \AND \Sy=0 \AND \Sz=0,0,acos(\Sz/(sqrt(\Sx^(2) + \Sy^(2) + \Sz^(2)))))}
2)我也失败了,\equal
命令出现一堆错误(日志档案)。你能告诉我正确的语法吗?谢谢。
\pgfmathsetmacro\polar{ifthenelse(\equal{\Sx}{0} \AND \equal{\Sy}{0} \AND \equal{\Sz}{0},0,acos(\Sz/(sqrt(\Sx^(2) + \Sy^(2) + \Sz^(2)))))}
编辑:工作示例与前一个主题没有什么不同。
梅威瑟:
\documentclass[a4paper,fleqn,leqno]{article}
\usepackage{tikz,tikz-3dplot}
\usetikzlibrary{arrows.meta,decorations.markings}
\begin{document}
\begin{tikzpicture}[cm={-1,-1,1,0,(0,0)},x=3.85mm,z=-1cm]
\draw[-{Classical TikZ Rightarrow[scale=1.2]},thick] (-2,0,0) -- (5,0,0) node[anchor=north,xshift=-3pt] {$x$};
\draw[-{Classical TikZ Rightarrow[scale=1.2]},thick] (0,-2,0) -- (0,5,0) node[anchor=west] {$y$};
\draw[-{Classical TikZ Rightarrow[scale=1.2]},thick] (0,0,-2) -- (0,0,5) node[anchor=south] {$z$};
\def\Sx{0} \def\Sy{0} \def\Sz{-3}
% code without dealing with zero division
\tdplotsetcoord{S}{sqrt((\Sx)^(2) + (\Sy)^(2) + (\Sz)^(2))}{acos(\Sz/(sqrt((\Sx)^(2) + (\Sy)^(2) + (\Sz)^(2))))}{ifthenelse(\Sy<0,-acos(\Sx/(sqrt((\Sx)^(2) + (\Sy)^(2)))),acos(\Sx/(sqrt((\Sx)^(2) + (\Sy)^(2)))))}
% code implementing zero coordinations definition
\pgfmathsetmacro\polar{ifthenelse(\Sx=0 \AND \Sy=0 \AND \Sz=0,0,acos(\Sz/(sqrt(\Sx^(2) + \Sy^(2) + \Sz^(2)))))}
% plus asimuth angle zero definition...
\tdplotsetcoord{S}{sqrt((\Sx)^(2) + (\Sy)^(2) + (\Sz)^(2))}{\polar}{...}
\draw[-{Stealth[scale=1.5,width=3pt]},color=red,thick] (0,0,0) -- (S) node[midway,anchor=east,font=\footnotesize] {${\vec{r}}_{1}$};
\draw[dashed,color=red!70!white,semithick] (0,0,0) -- (Sxy);
\draw[dashed,color=red!70!white,semithick] (Sxy) -- (S);
\end{tikzpicture}
\end{document}
答案1
表达方式
\pgfmathsetmacro\polar{
ifthenelse(\Sx=0 \AND \Sy=0 \AND \Sz=0,
0,
acos(\Sz/(sqrt(\Sx^(2) + \Sy^(2) + \Sz^(2)))))}
有几个错误。ifthenelse
关键字实现pgf
有一个不同的语法与包\ifthenelse
中的宏不同ifthen
。您似乎试图将两者混合在一起,因此出现了问题。对于ifthenelse
关键字,逻辑“与”表示为&&
,数值相等表示为==
。您还需要确保您的平方适用于整个例如 \Sz
通过添加括号:
\pgfmathsetmacro\polar{
ifthenelse(\Sx==0 && \Sy==0 && \Sz==0,
0,
acos(\Sz/(sqrt((\Sx)^(2) + (\Sy)^(2) + (\Sz)^(2)))))}
您也不能使用ifthenelse
关键字进行文本比较,因此\EQUAL
根本不适用。
答案2
最终的代码如下所示,以便于某些人方便工作:
\def\Sx{-2} \def\Sy{-3} \def\Sz{2}
\pgfmathsetmacro\Sρ{"sqrt((\Sx)^(2)+(\Sy)^(2)+(\Sz)^(2))"}
\pgfmathsetmacro\Sθ{ifthenelse(\Sx==0&&\Sy==0&&\Sz==0,0,"acos(\Sz/(sqrt((\Sx)^(2)+(\Sy)^(2)+(\Sz)^(2))))")}
\pgfmathsetmacro\SΦ{ifthenelse(\Sx==0&&\Sy==0,0,ifthenelse(\Sy<0,"-acos(\Sx/(sqrt((\Sx)^(2)+(\Sy)^(2))))","acos(\Sx/(sqrt((\Sx)^(2)+(\Sy)^(2))))"))}
\tdplotsetcoord{S}{\Sρ}{\Sθ}{\SΦ}
最后三个数学表达式必须返回为"text strings"
(也必须在另一个变量中完成以对它们进行评估tdplotsetcoord
),否则即使第二个选项是返回,ifthenelse
命令也会评估这些表达式(->获取)。zero division error