用纯 tikz 给一个弱的解答。思路是先求出多边形的重心,然后在重心到顶点射线的方向上的合适位置放置标签,用 calc 库计算坐标。
\documentclass[tikz,border=1cm]{standalone}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\foreach \x/\y in {%
(0,0)/a,
(1,1)/b,
(3,2)/c,
(4,-1)/d,
(2,-2)/e}
{ \node[fill, circle, inner sep =0pt, minimum size = 3pt] (\y) at \x {}; }
\draw plot coordinates {(a) (b) (c) (d) (e) (a)};
\coordinate (O) at ($0.2*(a)+ 0.2*(b)+ 0.2*(c)+ 0.2*(d)+ 0.2*(e)$);
\fill[red] (O) circle(2pt);% 重心
\foreach \x in {a,c,d,e}
{\node at ($(O)!1.15!(\x)$){$\x$};}
\node at ($(O)!1.22!(b)$){$b$};
\end{tikzpicture}
\end{document}
不难看到,用重心作为射线的起点并不完美,上图中的 b 标签就不能合适放置,故而只能单独绘制。
对于在圆上的凸多边形,存在到所有顶点距离相等的点,用该点作为射线起点比较合适,但对应一般的凸多边形不存在这样的点,所以仅仅用重心并不合适。
以上操作,本质上和逐个绘制标签没有区别,仅仅是用 foreach 简化操作。
问 是否可以实现对一些可构成(凸)多边形的点实现自动智能在其外侧添加标签?