我需要一些帮助来绘制带有细线描边的任意形状。目标:绘制透明的细线描边,该描边将显示本例中的背景海绿色、路径上的内描边和外描边。
在这个第一个示例代码中,我采用了 Inkscape 中使用的一种技术,将对象与自身进行裁剪,以生成外描边和内描边路径,然后将它们叠加在一起。外描边裁剪的实现如下:这里,归功于符号 1。
我还没有弄清楚的问题是如何添加透明细线。我在 Inkscape 中执行此操作的方法是通过将笔触转换为路径,然后使用这个新形状进行剪辑。
理想情况下,我可以为路径指定一种“橡皮擦”颜色。但实际上我想要做的是在描边线下方进行剪切。我在形状中添加了 50% 不透明度的白色描边,以演示剪切的位置。
\documentclass[boarder=7pt]{standalone}
\usepackage{fontspec}%unit code character support, advanced font configuration
\usepackage{tikz}
\usetikzlibrary{arrows,automata,positioning,calc,backgrounds}
% https://tex.stackexchange.com/questions/12010/how-can-i-invert-a-clip-selection-within-tikz
\tikzset{%credit Symbol 1
clip even odd rule/.code={\pgfseteorule}, % Credit to Andrew Stacey
reverseclip/.style={
clip,insert path=
[clip even odd rule]{
[reset cm](-\maxdimen,-\maxdimen)rectangle(\maxdimen,\maxdimen)
}
}
}%endtikzset
\usepackage{xfp}%for fpeval{}
%here I define an arrow path
\def\arrowheight{1}
\def\arrowwidth{0.9}
\def\arrowtailratio{0.42}
\def\arrowtailwidth{0.42}
\def\arrowmidline{\fpeval{2*\arrowheight*\arrowtailratio-1}}
\def\mypath{(0,\arrowheight) --
(\arrowwidth,\arrowmidline) --
(\arrowtailwidth,\arrowmidline) --
(\arrowtailwidth,-\arrowheight) --
(-\arrowtailwidth,-\arrowheight) --
(-\arrowtailwidth,\arrowmidline) --
(-\arrowwidth,\arrowmidline) --
cycle;}
\begin{document}
%
%
\begin{tikzpicture}[background rectangle/.style={fill=green!55!blue}, show background rectangle]
\begin{scope}
%create an outerstroke by reverse clipping
\begin{pgfinterruptboundingbox}%these are needed for bounding box stuff when reverse clipping
\path[reverseclip] (0,0) \mypath
\end{pgfinterruptboundingbox}
\path[draw,scale=1,line width=4,color=black,fill=black,anchor=center]
\mypath
\end{scope}
\begin{scope}
%create an innerstroke by clipping
\path[clip] (0,0) \mypath
\path[draw,scale=1,line width=4,color=red,draw opacity=0.8,fill=cyan,anchor=center] \mypath
\end{scope}
%draw my white demonstration line
\begin{scope}
\path[draw,line width=1,color=white, draw opacity=0.5] \mypath
\end{scope}
\end{tikzpicture}
\end{document}
另一种可能性,虽然不是我想要的,因为它没有内部笔触,但却展示了一种非常聪明的方法这里,我已尽我所能对其进行了修改,以便与通用路径配合使用。这似乎通过在彼此顶部重复描边并减少厚度来实现。但这留下了一个问题,即如果颜色变为半透明,它会开始显示最后使用的颜色的描边颜色,而不是背景。
\documentclass[tikz,border=7pt]{standalone}
\usetikzlibrary{shapes.symbols}
\usetikzlibrary{arrows,automata,positioning,calc,backgrounds}
%https://tex.stackexchange.com/questions/477589/how-to-add-multiple-differently-colored-borders-around-a-node
% define the rainbow style
\tikzset{
% next color/.style={preaction={draw=#1,next width}},
next opacity/.style={preaction={draw=#1, draw opacity={0.5},next width}},
next width/.code={
\pgfkeysalso{line width/.expanded={\rainbowwidth pt}}
\pgfmathsetmacro{\rainbowwidth}{\rainbowwidth-\rainbowstep} % decrease the rainbow width
\xdef\rainbowwidth{\rainbowwidth} % set the rainbow width global
},
% rainbow/.style={next color/.list={#1}},
rainbow/.style={next opacity/.list={#1}},
rainbow/.prefix code={
\edef\rainbowstep{\the\pgflinewidth}
\foreach[count=\i]~in{#1}{} % count the number of colors
\pgfmathsetmacro{\rainbowwidth}{\i*\rainbowstep}
}
}
\begin{document}
\begin{tikzpicture}[background rectangle/.style={fill=green!55!blue}, show background rectangle]
\path[fill,line width=1mm,inner sep=-4,fill=gray,rainbow={red,orange,yellow,green,blue,purple}] (0,0) -- (3,3) -- (6,0) -- cycle;
\end{tikzpicture}
\end{document}