我先从一些背景开始 - 我有几个 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}
这得出