我想用不同的图案填充双线路径的内部:孵化,随机点,泊松圆, 网格。
考虑以下六边形,我想填充边缘的内部。
\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
,它使用矩形节点“绘制”一条线。它有三个参数:
- 节点的 Tikz 样式(在这里您可以指定图案、填充颜色等,以及节点的“最小高度”,这将是生成的“线”宽度)
- 起点坐标(可以是命名节点)
- 终点坐标
\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}
结果如下: