Tikz:对区域进行着色的方法

Tikz:对区域进行着色的方法
\begin{document}
\begin{tikzpicture}
\draw (0, 0) -- (0, 8) -- (8, 8) -- (8, 0) --cycle;
\draw (0, 8) -- (8, 4);
\draw (0, 0) -- (8, 8);
\end{tikzpicture}
\end{document}

在此处输入图片描述

除了计算交点并手动绘制每个形状等之外,我还有什么其他选择来为四个区域中的任何一个着色?

答案1

编辑1:增加了对区域进行着色的第二种可能性。

编辑2:将节点放置在区域的中心

一种可能性是使用 TikZ 计算正方形中绘制的两个线段的交点坐标;然后对所需部分着色。

为此,有一个操作不再记录在手册 3.0.1a 中,但功能齐全。其文档可在1.18仍可用的手册中找到(直到什么时候?)此处TikZ 手册 1.18(第 87 页,第 10.2.4 节交叉坐标系)。

\documentclass[border=5pt]{standalone}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}
\draw (0, 0) coordinate(A)node[below left]{A}-- (0, 8)coordinate(B)node[above left]{B} -- (8, 8)coordinate(C)node[above right]{C} -- (8, 0)coordinate(D)node[below right]{D} --cycle;
\draw (B) -- (8, 4)coordinate(E)node[right]{E};
\draw (A) -- (C);
\coordinate (I) at (intersection of 0,8--E and A--C);
\fill[green](A)--(B)--(I)--cycle;
\fill[blue](B)--(C)--(I)--cycle;
\fill[red](C)--(E)--(I)--cycle;
\fill[violet](A)--(D)--(E)--(I)--cycle;
\end{tikzpicture}
\end{document}

填充区域

编辑 2:相同Intersections of Arbitrary Paths

另一种可能性是使用intersections手册 3.0.1a(p137;13.3.2 任意路径的交点)中记录的库,该库允许计算任意两条路径(直线或曲线)交点的坐标。

\documentclass[border=5pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{intersections}
\begin{document}
\begin{tikzpicture}
\draw (0, 0) coordinate(A)node[below left]{A}-- (0, 8)coordinate(B)node[above left]{B} -- (8, 8)coordinate(C)node[above right]{C} -- (8, 0)coordinate(D)node[below right]{D} --cycle;
\draw[name path=ae] (B) -- (8, 4)coordinate(E)node[right]{E};
\draw[name path=ac] (A) -- (C);
\path[name intersections ={of= ae and ac,by=I}];
\fill[green](A)--(B)--(I)--cycle;
\fill[blue](B)--(C)--(I)--cycle;
\fill[red](C)--(E)--(I)--cycle;
\fill[violet](A)--(D)--(E)--(I)--cycle;
\end{tikzpicture}
\end{document}

编辑 3:将节点放置在区域的中心

要将节点放置在区域的中心,可以使用重心坐标(p133,第 13.2.2 节重心系统)。

我放置了几个具有不同选项的节点,以便让您概览 TikZ 的可能性。

重心

\documentclass[border=5pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{intersections,shapes.geometric}
\begin{document}
\begin{tikzpicture}
\draw (0, 0) coordinate(A)node[below left]{A}-- (0, 8)coordinate(B)node[above left]{B} -- (8, 8)coordinate(C)node[above right]{C} -- (8, 0)coordinate(D)node[below right]{D} --cycle;
\draw[name path=ae] (B) -- (8, 4)coordinate(E)node[right]{E};
\draw[name path=ac] (A) -- (C);
\path[name intersections ={of= ae and ac,by=I}];
\fill[green](A)--(B)--(I)--cycle;
\node[node font=\bf,ellipse,draw,fill=white,inner sep=1pt] at (barycentric cs:A=1,B=1.2 ,I=1.5) {Zone 1};
\fill[blue](B)--(C)--(I)--cycle;
\node[text=white,node font={\it\Large},draw=white,thick] at (barycentric cs:C=1,B=1 ,I=1) {Zone 2};
\fill[red](C)--(E)--(I)--cycle;
\node[fill=cyan,double=white,double distance=2pt,draw,rounded corners] at (barycentric cs:C=1,E=1 ,I=1) {Zone 3};
\fill[violet](A)--(D)--(E)--(I)--cycle;
\node[fill=white,circle] at (barycentric cs:A=1,D=1.4,E=1 ,I=1) {Zone 4};
\end{tikzpicture}
\end{document}

使用 www.DeepL.com/Translator 翻译

答案2

一个可能不太为人所知的可能性是使用 pgfplots 库fillbetween。为了表明我没有覆盖不同的部分,我在动画中分别填充了每个部分。

\documentclass[tikz,border=3.14mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}
\usepgfplotslibrary{fillbetween}
\begin{document}
\foreach \X in {0,...,3}
{\begin{tikzpicture}
\draw[name path=box] (0, 0) -- (0, 8) -- (8, 8) -- (8, 0) --cycle;
\draw[name path=d1] (0, 8) -- (8, 4);
\draw[name path=d2] (0, 0) -- (8, 8);
\ifcase\X
\fill [blue,intersection segments={of=d1 and d2,
                sequence={A0 -- B0[reverse]}}];
\or             
\fill [blue,intersection segments={of=d1 and d2,
                sequence={A0 -- B1}}];
\or             
\fill [blue,intersection segments={of=d1 and d2,
                sequence={A1[reverse] -- B1}}];
\or             
\path [name path=aux,intersection segments={of=d1 and d2,
                sequence={A1[reverse] -- B0[reverse]}}];                
\fill [blue,intersection segments={of=aux and box,
                sequence={A1 -- B2[reverse]}}];         
\fi                     
\end{tikzpicture}}
\end{document}

在此处输入图片描述

答案3

fill以下是后续方法clip(不参考交点):

\documentclass[tikz,border=7pt]{standalone}
\begin{document}
  \begin{tikzpicture}
    \path
      (0, 0) coordinate (A)
      (8, 8) coordinate (C)
      (8, 4) coordinate (E);
    \begin{scope} % red zone : fill after clip
      \clip (A) -- (A-|C) -- (C);
      \clip (E)--(C)-- (A|-C);
      \fill[red] (A) rectangle (C);
    \end{scope}
    \begin{scope} % yellow zone : fill after clip
      \clip (A) -- (C) -- (A|-C);
      \clip (A|-C)--(A)-- (A-|C)--(E);
      \fill[yellow] (A) rectangle (C);
    \end{scope}
    \draw (A) rectangle (C) -- (A) (A|-C) -- (E);
  \end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容