tikz,找到最接近另一个点的点

tikz,找到最接近另一个点的点

目前,我正在尝试学习使用 latex(tikz)和 R 实现图形绘制的自动化。

我需要确定与定义点“北”距离最小的点的坐标

这就是我目前发现的:

\begin{tikzpicture}

\coordinate (North) at (0,5);

\path let
  \p1 = ($(North)-(node_1)$), \n1 = {veclen(\x1,\y1)}
, \p2 = ($(North)-(node_2)$), \n2 = {veclen(\x2,\y2)}
, \p3 = ($(North)-(node_3)$), \n3 = {veclen(\x3,\y3)}
, \p4 = ($(North)-(node_4)$), \n4 = {veclen(\x4,\y4)}
in coordinate (dummy1) at (\x1, \y1)
coordinate (dummy2) at (\x2, \y2)
coordinate (dummy3) at (\x3, \y3)
coordinate (dummy4) at (\x4, \y4);

\end{tikzpicture}

点 node_1 到 node_4 是预先确定的。我的基本想法是实现类似 if 循环的东西:

如果 \n1 == min(n1, \n2, \n3,\n4) 则坐标 (nearest_to_north) 在 (node_1) elseif \n2 == min(n1, \n2, \n3,\n4) 则坐标 (nearest_to_north) 在 (node_2) elseif...

整个 Latex 代码嵌入在 *.Rnw 文件中,因此也可以在 R 代码中实现循环,但我也不了解如何将 Latex 命令 \n1、\x1、\y1 传输到 R。

tikz 语法对我来说非常令人困惑...所以我期待任何建议或帮助:roll::roll:...

我也用德语在这里问了这个问题:https://golatex.de/viewtopic,p,106794.html#106794 英文版本如下:https://latex.org/forum/viewtopic.php?f=45&t=32581&p=109553#p109553

答案1

这就是我认为你要问的问题,为了说明这一点,我创建了 5 个随机点p1,...,p5和另一个随机点Q,然后问 TiZ 告诉我 5 个随机点中哪一个最接近Q。为了展示它的工作原理,我附加了一个动画。

\documentclass[tikz,border=3.14mm]{standalone}
\usetikzlibrary{calc}
\begin{document}
\foreach \Ani in {1,...,20}
{\begin{tikzpicture}
 \path[use as bounding box] (-5.1,-5.1) rectangle (5.1,5.1); % for animation
 \foreach \X in {1,...,5}
 {\path (8*rnd-4,8*rnd-4) coordinate (p\X) 
    node[fill,circle,inner sep=1pt,label=below:\X]{};}
 \path (8*rnd-4,8*rnd-4) coordinate (Q) 
    node[fill,blue,circle,inner sep=1pt,label=below:$Q$]{}; 
 \path  foreach \X in {1,...,5} {let \p\X=($(p\X)-(Q)$),\n\X={veclen(\x\X,\y\X)}
 in \pgfextra{\ifnum\X=1
  \xdef\MinPt{1}
  \xdef\MinLen{\n1}
 \else
  \pgfmathsetmacro{\NewMinLn}{min(\n\X,\MinLen)}
  \ifdim\NewMinLn pt<\MinLen
   \xdef\MinPt{\X}
  \fi
  \xdef\MinLen{\NewMinLn pt}
 \fi}} [draw,red] (p\MinPt) -- (Q);
\end{tikzpicture}}
\end{document}

在此处输入图片描述

当然,我不知道您的用例需要哪种语法。可以将其明确地设为一种风格,但我不知道要求是什么。这是一种可能的方法。

\documentclass[tikz,border=3.14mm]{standalone}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}[name closest point of/.style args={#1 to #2 by #3}{insert path={
foreach \Coord [count=\XX] in {#1}
{let \p\XX=($(\Coord)-(#2)$),\n\XX={veclen(\x\XX,\y\XX)}
 in \pgfextra{\ifnum\XX=1
  \xdef\MinPt{1}
  \xdef\MinLen{\n1}
 \else
  \pgfmathsetmacro{\NewMinLn}{min(\n\XX,\MinLen)}
  \ifdim\NewMinLn pt<\MinLen
   \xdef\MinPt{\XX}
  \fi
  \xdef\MinLen{\NewMinLn pt}
 \fi}} \pgfextra{\foreach \Coord [count=\XX] in {#1}
 {\ifnum\XX=\MinPt
  \xdef\ClosestPoint{\Coord}
 \fi}} (\ClosestPoint) coordinate (#3)
}}]
 \path (1,2)coordinate (pft) (2,3) coordinate (blub) (3,-4) coordinate (duck)
 (-4,-5) coordinate(koala) (-5,2) coordinate (squirrel);
 \path foreach \X in {blub,pft,duck,koala,squirrel}
  {(\X) node[circle,fill,inner sep=1pt,label=below:\X]{}};
 \path[name closest point of={blub,pft,duck,koala} to squirrel by mouse]
 [draw=red] (squirrel) -- (mouse);
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容