查找列表中最远的节点

查找列表中最远的节点

我在参数路径上有节点,我想知道哪个节点距离 (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

这是实现此目的的一种方法。打印结果如下:

在此处输入图片描述

笔记:

  • 为了简化这个例子,我不再需要提取坐标,而是将单独的 值输入xy\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}

为了方便引用每个节点,我将它们命名为节点,这样您可以轻松地在最大距离的第一个节点处放置标记。

相关内容