Tikz 使用图案填充双线而不是颜色

Tikz 使用图案填充双线而不是颜色

我想用不同的图案填充双线路径的内部:孵化随机点泊松圆, 网格。

考虑以下六边形,我想填充边缘的内部。

\documentclass[tikz]{standalone}
\usetikzlibrary{calc}

\begin{document}
\begin{tikzpicture}
\def\h{2}
\def\l{1}
\def\t{0.1} % thickness
\def\strokewidth{0.01cm}

\coordinate (A) at (0,0);
\coordinate (B) at ($(A) + (-30:\l)$);
\coordinate (C) at ($(B) + (0,-\h)$);
\coordinate (D) at ($(C) + (-150:\l)$);
\coordinate (E) at ($(D) + (150:\l)$);
\coordinate (F) at ($(E) + (0,\h)$);
\coordinate (A1) at ($(A) + (0,\h/2)$);
\coordinate (B1) at ($(B) + (30:\l/2)$);
\coordinate (C1) at ($(C) + (-30:\l/2)$);
\coordinate (D1) at ($(D) + (0,-\h/2)$);
\coordinate (E1) at ($(E) + (-150:\l/2)$);
\coordinate (F1) at ($(F) + (+150:\l/2)$);
\draw[line width=\strokewidth, double=none, double distance=\t*1cm-2*\strokewidth]
      (A) -- (B) -- (C) -- (D) -- (E) -- (F) -- cycle
      (A) -- (A1)
      (B) -- (B1)
      (C) -- (C1)
      (D) -- (D1)
      (E) -- (E1)
      (F) -- (F1)
      ;
\end{tikzpicture}
\end{document}

在此处输入图片描述

我知道 tikz 文档指出,双线是通过绘制两条线粗细不同的实线来实现的。所以这意味着可能需要更复杂的解决方案。

相关问题可能是使双边框线之间的填充/间隙透明

答案1

无法填充一条线,只能填充一个区域。所以这里有一个疯狂的想法。将绘图中的每条“线”转换为可以随意填充的矩形。

以下代码实现了一个名为的宏\tikzsegment,它使用矩形节点“绘制”一条线。它有三个参数:

  1. 节点的 Tikz 样式(在这里您可以指定图案、填充颜色等,以及节点的“最小高度”,这将是生成的“线”宽度)
  2. 起点坐标(可以是命名节点)
  3. 终点坐标

\draw[styles] (a) -- (b)请注意,您现在必须使用标准语法,而不是标准语法\tikzsegment{styles}{a}{b},因此您无法在单个路径中绘制多条线(并且无法关闭路径)。但是,您可以结合之前的技术来绘制所需的路径(及其边框),然后应用此技术来填充每个段,就像我在以下示例中所做的那样:

\usetikzlibrary{calc}
\usetikzlibrary{patterns}

\def\tikzsegment#1#2#3{ % This is the macro explained above
\path let
      \p1=($(#3)-(#2)$),
      \n1={veclen(\p1)}
 in (#2) -- (#3) 
    node[minimum width=\n1, 
         inner sep=0pt, 
         pos=0.5,sloped,rectangle,
         #1] 
     (line){};
}


\begin{tikzpicture}
% This is your code untouched
\def\h{2}
\def\l{1}
\def\t{0.1} % thickness
\def\strokewidth{0.01cm}

\coordinate (A) at (0,0);
\coordinate (B) at ($(A) + (-30:\l)$);
\coordinate (C) at ($(B) + (0,-\h)$);
\coordinate (D) at ($(C) + (-150:\l)$);
\coordinate (E) at ($(D) + (150:\l)$);
\coordinate (F) at ($(E) + (0,\h)$);
\coordinate (A1) at ($(A) + (0,\h/2)$);
\coordinate (B1) at ($(B) + (30:\l/2)$);
\coordinate (C1) at ($(C) + (-30:\l/2)$);
\coordinate (D1) at ($(D) + (0,-\h/2)$);
\coordinate (E1) at ($(E) + (-150:\l/2)$);
\coordinate (F1) at ($(F) + (+150:\l/2)$);

\draw[line width=\strokewidth, double=none, double distance=\t*1cm-2*\strokewidth]
      (A) -- (B) -- (C) -- (D) -- (E) -- (F) -- cycle
      (A) -- (A1)
      (B) -- (B1)
      (C) -- (C1)
      (D) -- (D1)
      (E) -- (E1)
      (F) -- (F1)
      ;

% This is the new code to fill each segment
\coordinate (prev) at (F);
\foreach \vertex in {A,B,C,D,E,F} {
  \tikzsegment{pattern=crosshatch dots, 
               pattern color=blue, 
               minimum height=\t*1cm}
              {prev}{\vertex};
  \coordinate (prev) at (\vertex);
  \tikzsegment{pattern=north west lines, 
               minimum height=\t*1cm}
              {\vertex}{\vertex1};
}
\end{tikzpicture}

结果如下:

结果

相关内容