![在 Voronoi 图上绘制三角形,使用 pgfplots/Tikz 绘制三角形的阴影部分](https://linux22.com/image/316842/%E5%9C%A8%20Voronoi%20%E5%9B%BE%E4%B8%8A%E7%BB%98%E5%88%B6%E4%B8%89%E8%A7%92%E5%BD%A2%EF%BC%8C%E4%BD%BF%E7%94%A8%20pgfplots%2FTikz%20%E7%BB%98%E5%88%B6%E4%B8%89%E8%A7%92%E5%BD%A2%E7%9A%84%E9%98%B4%E5%BD%B1%E9%83%A8%E5%88%86.png)
使用这个之前问过的问题我能够从一组生成的数据中绘制 Voronoi 多边形。我想通过执行以下操作进一步注释该图:
- 通过操纵输入数据解决:添加由三个点创建的三角形。
- 用不同的颜色对每个 Voronoi 多边形内的三角形区域进行轻微阴影处理(不透明度约为 0.25)。因此,三个阴影区域是由 Voronoi 和三角形元素的交点生成的多边形。
- 标记从点数据文件生成的每个节点(红点)。
我已提供目前为止我所拥有的 MWE。在此先感谢所有帮助/指导。
数据位于voronoiPoints.dat
:
-0.135778 -0.651569
-0.658113 1.655264
1.645370 0.643096
数据位于voronoi.dat
:
0.276155 0.654257
2.349036 -2.197525
0.276155 0.654257
-3.162349 -0.124321
0.276155 0.654257
1.694429 3.881949
数据位于vornoiTriPoints.dat
:
-0.135778 -0.651569
-0.658113 1.655264
1.645370 0.643096
-0.135778 -0.651569
生成图形的代码:
\documentclass[tikz,border=5]{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[axis equal image,
xtick=\empty,
ytick=\empty]
\addplot [only marks, red] table {voronoiPoints.dat};
\addplot [no markers, blue] table {voronoiTriPoints.dat};
\addplot [no markers, update limits=false] table {voronoi.dat};
\end{axis}
\end{tikzpicture}
\end{document}
答案1
以下是使用该fillbetween
库的一种可能性:
代码:
\documentclass[tikz,border=5]{standalone}
\usepackage{pgfplots}
\usepgfplotslibrary{fillbetween}
\usepackage{filecontents}
\begin{filecontents*}{voronoiPoints.dat}
1.645370 0.643096
-0.658113 1.655264
-0.135778 -0.651569
\end{filecontents*}
\begin{filecontents*}{voronoiTriPoints.dat}
-0.135778 -0.651569
-0.658113 1.655264
1.645370 0.643096
-0.135778 -0.651569
\end{filecontents*}
\begin{filecontents*}{voronoi.dat}
0.276155 0.654257
-3.162349 -0.124321
0.276155 0.654257
1.694429 3.881949
0.276155 0.654257
2.349036 -2.197525
0.276155 0.654257
-3.162349 -0.124321
\end{filecontents*}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
axis equal image,
xtick=\empty,
ytick=\empty,
set layers
]
\addplot [only marks, red] table {voronoiPoints.dat};
\addplot [no markers, blue,name path=triangle] table {voronoiTriPoints.dat};
\addplot [no markers, update limits=false,name path=lines] table {voronoi.dat};
\node[below=2pt]
at (axis cs:-0.135778,-0.651569)
{$a$};
\node[left=2pt]
at (axis cs:-0.658113,1.655264)
{$b$};
\node[right=2pt]
at (axis cs:1.645370,0.643096)
{$c$};
\clip[on layer=axis grid]
(axis cs:-0.135778,-0.651569) --
(axis cs:-0.658113,1.655264) --
(axis cs:1.645370,0.643096) --
(axis cs:-0.135778,-0.651569) -- cycle;
\addplot fill between[
on layer=main,
of=triangle and lines,
split,
every segment no 0/.style={blue,fill opacity=0},
every segment no 1/.style={yellow,fill opacity=0.25},
every segment no 2/.style={red,fill opacity=0.25},
every segment no 3/.style={green,fill opacity=0.25},
];
\end{axis}
\end{tikzpicture}
\end{document}
我不得不使用剪辑和图层来纠正填充的一些问题;我相信一定有更简单的方法。
答案2
以下是使用以下方法实现此目的的方法tkz-euclide
:
\documentclass{article}
\usepackage{tkz-euclide}
\usetkzobj{all}
\begin{document}
\begin{tikzpicture}
\tkzInit[xmin=0, xmax=3, ymin=1, ymax=4]
\tkzClip[space=1]
\tkzDefPoint(0,1){A} \tkzLabelPoint[below left](A){A}
\tkzDefPoint(3,2){B} \tkzLabelPoint[right](B){B}
\tkzDefPoint(1,4){C} \tkzLabelPoint[above](C){C}
\tkzCircumCenter(A,B,C)\tkzGetPoint{G}
\foreach \pointstart/\pointend in {A/B, B/C, C/A}{
\tkzDefMidPoint(\pointstart,\pointend)\tkzGetPoint{\pointstart'}
\tkzFindAngle(\pointstart,\pointstart',G)
\pgfmathparse{int( or(\tkzAngleResult>180, \tkzAngleResult<0))}
\ifnum\pgfmathresult=1
\tkzDrawLine[add=0 and 1](G, \pointstart')
\fi
}
\tkzClipPolygon(A,B,C)
\tkzDrawPolygon[draw=none, fill=gray, opacity=0.5](A,A',G,C')
\tkzDrawPolygon[draw=none, fill=gray, opacity=0.2](B,B',G,A')
\tkzDrawPolygon[draw=none, fill=gray, opacity=0.1](C,C',G,B')
\tkzDrawPolygon[color=red](A,B,C)
\end{tikzpicture}
\end{document}
代码可能看起来比必要的稍微复杂一些,这是因为它还处理三角形的外心位于三角形之外的情况: