如果否则变量相等

如果否则变量相等

上周我做了简单的坐标变换,以便\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

相关内容