我有一组点。我想用一个区域“包围”这些点。因为一张图片胜过千言万语:
这些点是我想要包围的点。我希望能够控制包围“速率”。一个参数允许我从点的凸包转到最小区域(但在填充内)。黄色区域是凸包,而红色区域是一种“最小”区域(带填充)。我希望能够获得“介于两者之间的任何区域”。例如,0 表示最小,1 表示“最大”(凸包),1/2 表示平均值
这样做的目的是“突出显示”一组点(您可以从图片中看到区域做得很好)但在某些情况下,我需要通过不使用凸包来防止重叠(例如,如果您组合蓝色和红色的点,那么这些点的凸包将与绿色重叠,而最小区域则不会)。
这可能比 tikz 更像一个数学问题,但也许有人知道一种简单的方法来实现这一点。(我正在使用 lualatex,并且更喜欢 lua 代码(或者可能是 C/C++),因为它肯定运行得更快)
顺便说一句,重点是让它易于使用。我想简单地指定点、参数和颜色,仅此而已,否则它会变得太繁琐,因为有很多区域需要处理。
答案1
[zh]我不确定它是否完全解决了你的问题,但我认为这是一个建设性的草案
更新最新版本的 pgf:请注意,atan2 的定义在最新版本中已被修改,我们从 atan2 (x, y) 移至 atan2 (y, x)。
[fr]我不知道该如何回答这个问题,但我认为这是一个建设性的
更新 pgf 的最新版本:请注意,在最新版本中 atan2 的定义已被修改,即从 atan2(x,y) 变为 atan2(y,x)。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{backgrounds}
\newdimen\qx
\newdimen\qy
\begin{document}
\begin{tikzpicture}
\foreach \nn/\cood in {1/{0,0},2/{1,2},3/{3,2},4/{4,1}}{
\node [circle,draw,fill=green,label=N\nn](N\nn) at (\cood) {};
}
\foreach \nn [remember=\nn as \lastx (initially 1)] in {2,3,4}{
\begin{scope}[shift={(N\lastx)}]
\pgfextractx\qx{\pgfpointanchor{N\nn}{center}}
\pgfextracty\qy{\pgfpointanchor{N\nn}{center}}
\pgfmathsetmacro{\angle}{atan2(\qy,\qx)}
\begin{scope}[rotate=\angle,on background layer]
\node[circle,minimum width=1cm,](N1a)at(N\lastx){};
\node[circle,minimum width=1cm,](N2a)at(N\nn){};
\coordinate(N1s) at (N1a.{\angle-90});
\coordinate(N1n) at (N1a.{\angle+90});
\coordinate(N2s) at (N2a.{\angle-90});
\coordinate(N2n) at (N2a.{\angle+90});
\draw[fill=pink,draw=pink] (N1s) (N1s) -- (N2s) arc (-90:90:0.5cm)--(N1n) arc (90:270:0.5cm) ;
\end{scope}
\end{scope}
}
\end{tikzpicture}
\end{document}