目前,我正在尝试学习使用 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
,然后问 Ti钾Z 告诉我 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}