填充和循环问题

填充和循环问题

有人能告诉我为什么矩形没有填充吗?那么基本上,为什么“循环不起作用?”我不明白。

\documentclass{article}
\usepackage{tikz}

\begin{document}

\begin{tikzpicture}

\tikzstyle{circ} = [circle, minimum width=2.0mm, inner sep=0pt,draw,fill]
\tikzstyle{num}  = [yshift=3mm]
% QUAD
\node[circ] (a) at (0.0, 0.0) {};
\node[circ] (b) at (1.5, 0.0) {};
\node[circ] (c) at (2.3, 1.0) {};
\node[circ] (d) at (0.8, 1.0) {};
\path[draw, line width=0.3mm,top color=gray!20,bottom color=white] (a) 
      node[num]{1} -- (b) node[num]{2} -- (c) node[num]{3} -- (d) node[num]{4} -- cycle;

\end{tikzpicture}

\end{document}

好的,按照链接的线程操作后,我重写了它。现在它可以工作了,但对于这么小的图片,我似乎需要写很多代码。

\begin{tikzpicture} % , show background rectangle

\tikzstyle{circ} = [circle, minimum width=2.0mm, inner sep=0pt,draw,fill]
\tikzstyle{num}  = [yshift=3mm]
% QUAD
\coordinate (a) at (0.0, 0.0);
\coordinate (b) at (1.5, 0.0);
\coordinate (c) at (2.3, 1.0);
\coordinate (d) at (0.8, 1.0);
\path[draw, line width=0.3mm,top color=gray!40,bottom color=white] (a)    node[num]{1} -- (b) node[num]{2} -- (c) node[num]{3} -- (d) node[num]{4} -- cycle;
\node[circ]  at (a) {};
\node[circ]  at (b) {};
\node[circ]  at (c) {};
\node[circ]  at (d) {};

\end{tikzpicture}

答案1

尽管我确信有重复的,但我找不到,但这里有一张简短的图片。

通常,当 TikZ 收到填充命令或选项时,它会查看最后一段路径,并尝试自动关闭它(无论是否使用该cycle选项)。这只是因为必须有一个区域需要填充。但是当只有两个点和一个填充指令时,它会耸耸肩,然后走开好吧,不管怎样,你的损失

这是一个简单的例子。

\begin{tikzpicture}
\fill[red,ultra thick] (0,0) -- (1,1);
\fill[blue,ultra thick] (0,0) -| (1,-1);
\end{tikzpicture}

在此处输入图片描述

如您所见,红色填充并不关心,但蓝色填充是可见的,因为它有一个适当的填充区域(角落是通过正交自动创建的-|)。

节点的问题基于此问题。如果直接连接具有边框形状(圆形、矩形等)的两个节点,它们将通过一条从其边框上的点开始的线连接。让我尝试通过放置彩色链接以使线段可见来演示这一点。

\begin{tikzpicture}
\node[draw,circle] (a) at (0,0) {A};
\node[draw] (b) at (2,1) {B};
\node[draw] (c) at (2,-1) {C};
\draw[ultra thick,blue!20] (a) -- (b);
\draw[ultra thick,green] (b) -- (c);
\draw[ultra thick,red] (c) -- (a);
\draw (a) -- (b) -- (c) -- (a);
\end{tikzpicture}

在此处输入图片描述

所有这些彩色链接都是独立且不相交的线段。你可以看到最后一个黑色似乎封闭路径实际上不是连续路径。它从一个边界开始,在另一个边界结束。然后开始一条全新的路径。这就是为什么我们不能填充内部,因为最后要填充的路径是从到,(c)因此(a)有两个点,因此没有要着色的区域。这也是循环不起作用的原因,因为它会回到(c)从边界开始的最后一部分(c)

因此你必须使用坐标,例如,如果我使用坐标而不是节点,那么它们就没有边界,它们只是点。这将是一条连续的路径。让我们试试

\begin{tikzpicture}
\node[draw,circle] (a) at (0,0) {A};
\node[draw] (b) at (2,1) {B};
\node[draw] (c) at (2,-1) {C};
\draw[ultra thick,blue!20] (a) -- (b);
\draw[ultra thick,green] (b) -- (c);
\draw[ultra thick,red] (c) -- (a);
\fill (a.center) -- (b.center) -- (c.center);
\end{tikzpicture} 

在此处输入图片描述

鲍勃是你的叔叔。这就是为什么你需要的不仅仅是通过节点来走动。这有点令人失望,但我可以向你保证,这实际上是一件好事,当你掌握它时,你可能会越来越感激它 :)

答案2

这只是对@percusse 详细回答的补充:您可以使用positioningbackground库。

\documentclass{article}
\usepackage{tikz}

\begin{document}
\usetikzlibrary{positioning,backgrounds}

\begin{tikzpicture}

\tikzstyle{circ} = [circle, minimum width=2.0mm, inner sep=0pt,draw,fill]
\tikzstyle{num}  = [yshift=3mm]
% QUAD
\node[circ] (a) at (0.0, 0.0) {};
\node[circ] (b) at (1.5, 0.0) {};
\node[circ] (c) at (2.3, 1.0) {};
\node[circ] (d) at (0.8, 1.0) {};
\begin{pgfonlayer}{background}
\fill[draw, line width=0.3mm,top color=gray!20,bottom color=white] (a.center)
      node[num]{1} -- (b.center) node[num]{2} -- (c.center) node[num]{3} -- (d.center) node[num]{4} -- (a.center);
\end{pgfonlayer}
\end{tikzpicture}

\end{document}

在此处输入图片描述

答案3

这是对以下评论的回应:

但对于这么小的图片,我似乎需要大量的代码。

TikZ 的语法相当冗长。通常,这是一件好事,因为它有助于清楚地说明发生了什么。但是,有时它看起来有点太多,在这种情况下,了解一些压缩它的技巧会很有用。以下是此代码的一个例子。它不是最多简洁,因为我试图确保它仍然可以理解。我所做的主要事情是将所有绘图折叠到一条路径。这样做的原因是因为节点是在它们所在的路径之后绘制的(此时绘图不会遮挡节点),但它们的坐标可以立即获得。我还使用标签同时做几件事。通过这样做,我可以定义坐标、绘制圆圈并放置数字。

\documentclass{article}
%\url{http://tex.stackexchange.com/q/81848/86}
\usepackage{tikz}

\begin{document}

\begin{tikzpicture}

\tikzset{
  circ/.style={
    label={[circlabel=#1]center:{}},
  },
  circlabel/.style={
    circle,
    minimum width=2.0mm,
    inner sep=0pt,
    draw,
    fill,
    label={above:#1},
  },
}
\shadedraw[
   line width=0.3mm,
   top color=gray!20,
   bottom color=white
]
(0.0, 0.0)
coordinate[circ=1] (a)
--
(1.5, 0.0)
coordinate[circ=2] (b)
--
(2.3, 1.0)
coordinate[circ=3] (c)
--
(0.8, 1.0)
coordinate[circ=4] (d)
--
cycle;
\end{tikzpicture}

\end{document}

在一条路径上定义所有内容可避免路径不连续的问题,因为节点不用于定义实际路径。正如我上面所做的那样,坐标、、、(a)指的是它们的确切点,这意味着在以后的调用中它们将正常工作:将按照您的要求运行。如果您不打算再次使用这些坐标(因此它们的唯一目的是定义此形状),那么您可以跳过命名步骤并进一步压缩代码。(b)(c)(d)\fill (a) -- (b) -- (c) -- (d) -- cycle;

\documentclass{article}
%\url{http://tex.stackexchange.com/q/81848/86}
\usepackage{tikz}

\begin{document}

\begin{tikzpicture}

\tikzset{
  circ/.style={
    circle,
    minimum width=2.0mm,
    inner sep=0pt,
    draw,
    fill,
    label={above:#1},
  },
}
\shadedraw[
   line width=0.3mm,
   top color=gray!20,
   bottom color=white
]
(0.0, 0.0)
node[circ=1] {}
--
(1.5, 0.0)
node[circ=2] {}
--
(2.3, 1.0)
node[circ=3] {}
--
(0.8, 1.0)
node[circ=4] {}
--
cycle;

\end{tikzpicture}

\end{document}

最后,由于标签遵循序列,我们可以实现其自动化。

\documentclass{article}
%\url{http://tex.stackexchange.com/q/81848/86}
\usepackage{tikz}
\newcounter{clabel}

\begin{document}

\begin{tikzpicture}

\tikzset{
  c/.style={
    insert path={
      node[
        circle,
        minimum width=2.0mm,
        inner sep=0pt,
        draw,
        fill,
        label={above:\stepcounter{clabel}\theclabel},
      ] {}
    }
  },
  reset clabel/.code={%
    \setcounter{clabel}{0}%
  }
}
\shadedraw[
  reset clabel,
  line width=0.3mm,
  top color=gray!20,
  bottom color=white,
]
(0.0, 0.0)
[c]
--
(1.5, 0.0)
[c]
--
(2.3, 1.0)
[c]
--
(0.8, 1.0)
[c]
--
cycle;

\end{tikzpicture}

\end{document}

所有这些都产生了完全相同的图像。

相关内容