在 Voronoi 图上绘制三角形,使用 pgfplots/Tikz 绘制三角形的阴影部分

在 Voronoi 图上绘制三角形,使用 pgfplots/Tikz 绘制三角形的阴影部分

使用这个之前问过的问题我能够从一组生成的数据中绘制 Voronoi 多边形。我想通过执行以下操作进一步注释该图:

  1. 通过操纵输入数据解决:添加由三个点创建的三角形。
  2. 用不同的颜色对每个 Voronoi 多边形内的三角形区域进行轻微阴影处理(不透明度约为 0.25)。因此,三个阴影区域是由 Voronoi 和三角形元素的交点生成的多边形。
  3. 标记从点数据文件生成的每个节点(红点)。

我已提供目前为止我所拥有的 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}

代码可能看起来比必要的稍微复杂一些,这是因为它还处理三角形的外心位于三角形之外的情况:

相关内容