给定一个二维点数组,如何访问 TikZ 中的各个元素?

给定一个二维点数组,如何访问 TikZ 中的各个元素?

我先从一些背景开始 - 我有几个 2D 点,我想将它们可视化为圆圈,此外,我想以某种方式连接这些 2D 点(例如,使用直线段连接后续点)。我并不想指定两次二维点的坐标,而只想指定一次,然后将它们用于两个目的。输入二维点数组。

现在,将 2D 点可视化为圆圈很简单。首先,我将定义一个pic

\tikzset{dot/.pic={\draw[fill, black!60] circle[radius=3pt];}}

接下来是

% Using curly brackets (cb)
\def\ptscb{{0,0}, {1,2}, {1,4}, {3,5}, {2,2}, {3,1}, {5,2}}

\begin{tikzpicture}
\foreach \p [count=\k] in \ptscb {
    \pic at (\p) {dot};
    \node[above right, black!40!green] at (\p) {\k};
}
\end{tikzpicture}

或者

% Using round brackets (rb)
\def\ptsrb{(0,0), (1,2), (1,4), (3,5), (2,2), (3,1), (5,2)}

\begin{tikzpicture}
\foreach \q [count=\l] in \ptsrb {
    \pic at \q {dot};
    \node[above right, black!40!red] at \q {\l};
}
\end{tikzpicture}

注意“内”括号的区别(分别卷曲圆形的在上面两个代码片段中,我们使用括号来表示这一点。

接下来,我不想使用plot或 类似的东西,而是想“手动”连接 2D 点(即绘制边缘段)。我最初的尝试是使用\draw \ptscb[0] -- \ptscb[1];\draw \ptsrb[0] -- \ptsrb[1];。不幸的是,这些不起作用。事实证明,数组的定义需要额外的一层卷曲括号:

% Using two curly brackets (ccb)
\def\ptsccb{{{0,0}, {1,2}, {1,4}, {3,5}, {2,2}, {3,1}, {5,2}}}

\begin{tikzpicture}
\draw (\ptsccb[0][0], \ptsccb[0][1]) -- (\ptsccb[1][0], \ptsccb[1][1]);
\end{tikzpicture}

这是可行的(尽管不幸的是,它似乎\foreach无法处理这些额外的括号),但我不喜欢使用双索引。我期望下面的方法可以工作,但不幸的是:

% Using curly and round brackets (crb)
\def\ptscrb{{(0,0), (1,2), (1,4), (3,5), (2,2), (3,1), (5,2)}}

\begin{tikzpicture}
\draw \ptscrb[0] -- \ptscrb[1];
\end{tikzpicture}

回到数组定义,使用两个卷曲括号中,下面的代码也没有返回我期望的结果——\node at (0,0) {\ptsccb[2]};没有显示实际的第二个元素,而只是显示整个数组,后面跟着。经过一番[2]挖掘,我发现\node at (0,0) {\pgfmathparse{array(\ptsccb,2)}\pgfmathresult};显示第二个元素(尽管显示为14而不是{1,4})。

最终,我的问题是是否有更优雅的方式来实现上述目标,即连接存储在数组中的二维点,无需使用双索引。我知道首先将每个 2D 点定义为“索引”坐标的选项如图所示,但除此之外,我不知道还有其他好的选择。

答案1

至少对我来说,你的问题是什么并不完全清楚。无论如何,我将按以下方式编写你的第二个代码示例:

\documentclass[border=3.141592]{standalone}
\usepackage{tikz}

\begin{document}
\def\ptsrb{(0,0), (1,2), (1,4), (3,5), (2,2), (3,1), (5,2)}

\begin{tikzpicture}[
dot/.style = {circle, fill=black!60, minimum size=6pt, inner sep=0pt},
every label/.append style = {inner sep=1pt, text= black!40!red}
                    ]
\foreach \q [count=\l] in \ptsrb 
    \node (n\l) [dot, label=above right:\l] at \q {};
\end{tikzpicture}
\end{document}

产生以下结果:

在此处输入图片描述

答案2

虽然这不完全是我想要的(因为它仍然在后台使用双重索引),但我认为我会添加它,因为它可能对其他人有用。

\documentclass{article}
\usepackage{tikz}
\begin{document}

\tikzset{dot/.pic={\draw[fill, black!60] circle[radius=3pt];}}

% Using two curly brackets (ccb)
\def\ptsccb{{{0,0}, {1,2}, {1,4}, {3,5}, {2,2}, {3,1}, {5,2}}}

\newcommand{\arr}[2]{(#1[#2][0], #1[#2][1])}

\begin{tikzpicture}
\foreach \k in {0, ..., 6} {
    \ifnum\k < 6
        \draw \arr{\ptsccb}{\k} -- \arr{\ptsccb}{\k+1};
    \fi
    \pic at \arr{\ptsccb}{\k} {dot};
    \node[above right, black!40!green] at \arr{\ptsccb}{\k} {\k};
}
\end{tikzpicture}

\end{document}

这得出

在此处输入图片描述

相关内容