我在参数路径上有节点,我想知道哪个节点距离 (0,0) 最远。我试过这个丑陋的东西:
\documentclass[a4paper]{article}
\usepackage[marginparsep=3pt, top=2cm, bottom=1.5cm, left=1.5cm, right=1.5cm]{geometry}
\usepackage{tikz}
\usetikzlibrary{calc,intersections}
\tikzset{small dot/.style={fill=black,circle,scale=0.3},}
\newcommand{\CoorXY}[1]{%
\pgfmathsetmacro\PjX{3*cos(\A)}
\pgfmathsetmacro\PjY{5*sin(\A)}
\node[small dot,label={[font=\scriptsize]#1}] at (\PjX,\PjY) {}
}
\begin{document}
\begin{tikzpicture}
\def\tmpB{0}
\def\Max{0}
\foreach \A in {0,10,...,360} {
\CoorXY{\A} ;
\pgfmathparse{veclen(\PjX,\PjY)} ;
\let\tmpA\pgfmathresult ;
\pgfmathifthenelse{\tmpA>\tmpB}{\A}{\Max} ;
\let\Max\pgfmathresult ;
\pgfmathifthenelse{\tmpA>\tmpB}{\tmpA}{\tmpB} ;
\let\tmpB\pgfmathresult ;
\message{Max \tmpB pour \Max}
}
\end{tikzpicture}
\end{document}
但它不起作用。知道原因吗?肯定有更好的办法。谢谢。
答案1
这是实现此目的的一种方法。打印结果如下:
笔记:
- 为了简化这个例子,我不再需要提取坐标,而是将单独的 值输入
x
到y
中\foreach
。 \foreach
在组内执行其内容,因此如果需要保存迭代内的值,则需要执行某种类型\global
的分配以在迭代之间保留该值。
代码:
\documentclass{article}
\usepackage{tikz}
%http://tex.stackexchange.com/questions/15297/how-to-test-if-a-number-is-negative
\newcommand\IfNonnegative[3]{%
\begingroup%
\pgfmathparse{ifthenelse(#1>=0,1,0)}%
\if\pgfmathresult 1 \relax%
{#2}%
\else%
{#3}%
\fi%
\endgroup%
}%
\newcommand*{\FarthestNodeX}{0}%
\newcommand*{\FarthestNodeY}{0}%
\newlength{\ExcessDistanceOfThisNode}%
\begin{document}
\foreach \PjX/\PjY in {1/3, 1/3, 5/2, 3/3, 0/0} {
\pgfmathsetlength{\ExcessDistanceOfThisNode}{veclen(\PjX,\PjY)-veclen(\FarthestNodeX,\FarthestNodeY)}
\IfNonnegative{\ExcessDistanceOfThisNode}{
\xdef\FarthestNodeX{\PjX}
\xdef\FarthestNodeY{\PjY}
}{}%
}
Farthest Node is at (\FarthestNodeX,\FarthestNodeY).
\end{document}
答案2
当前代码的主要问题是 foreach 循环内的命令范围\let
仅限于当前迭代。因此在下一次迭代开始时\tmpB
和\Max
均为 0。解决此问题的最简单方法是声明这些操作\global
:
\documentclass[a4paper]{article}
\usepackage[marginparsep=3pt, top=2cm, bottom=1.5cm, left=1.5cm, right=1.5cm]{geometry}
\usepackage{tikz}
\usetikzlibrary{calc,intersections}
\tikzset{small dot/.style={fill=black,circle,scale=0.3},}
\newcommand{\CoorXY}[1]{%
\pgfmathsetmacro\PjX{3*cos(\A)}
\pgfmathsetmacro\PjY{5*sin(\A)}
\node [small dot,label={[font=\scriptsize]#1}] (n#1) at (\PjX,\PjY) {}
}
\begin{document}
\begin{tikzpicture}
\def\tmpB{0}
\def\Max{0}
\foreach \A in {0,10,...,360} {
\CoorXY{\A} ;
\pgfmathparse{veclen(\PjX,\PjY)} ;
\let\tmpA\pgfmathresult ;
\pgfmathifthenelse{\tmpA>\tmpB}{\A}{\Max} ;
\global\let\Max\pgfmathresult ;
\pgfmathifthenelse{\tmpA>\tmpB}{\tmpA}{\tmpB} ;
\global\let\tmpB\pgfmathresult ;
}
\node (0,0) {Max \tmpB\ pour \Max};
\node [pin={MAX}] at (n\Max) {};
\end{tikzpicture}
\end{document}
为了方便引用每个节点,我将它们命名为节点,这样您可以轻松地在最大距离的第一个节点处放置标记。